Utilizzando avconv, quando si esegue il remuxing in MKV, esiste un modo per correggere i file di input AVI compressi?


11

A causa dei bug di compatibilità tra il server Plex e i televisori Panasonic, l'unico modo per farlo funzionare bene è rimodellare tutto in MKV, copiare direttamente tutti i flussi (video, audio, sottotitoli)

Sembra abbastanza semplice:

avconv -i "input.avi" -c copy "output.mkv"

ad eccezione di:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:00:59 with gcc 4.6.3
[mpeg4 @ 0x8422140] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.4.1 (build 2117/release)
  Duration: 00:27:38.52, start: 0.000000, bitrate: 1173 kb/s
    Stream #0.0: Video: mpeg4 (Advanced Simple Profile), yuv420p, 640x352 [PAR 1:1 DAR 20:11], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 132 kb/s
File 'output.mkv' already exists. Overwrite ? [y/N] y
Output #0, matroska, to 'output.mkv':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: mpeg4, yuv420p, 640x352 [PAR 1:1 DAR 20:11], q=2-31, 1k tbn, 25 tbc
    Stream #0.1: Audio: libmp3lame, 48000 Hz, stereo, 132 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press ctrl-c to stop encoding
[matroska @ 0x8422cc0] Can't write packet with unknown timestamp
av_interleaved_write_frame(): Invalid argument

Con le relative linee gotcha:

[mpeg4 @ 0x8422140] Invalid and inefficient vfw-avi packed B frames detected#
<snip>
[matroska @ 0x8422cc0] Can't write packet with unknown timestamp
av_interleaved_write_frame(): Invalid argument

Non riesco a vedere un'opzione per decomprimere i frame B (o costruire una timemap VBR? Abbiamo bisogno di quelli in avconv?)

C'è un modo per farlo, come in avidemux?

Risposte:


8

Una soluzione alternativa è convertire prima in .mp4:

avconv -i input.avi -c copy temp.mp4
avconv -i temp.mp4 -c copy output.mkv
rm temp.mp4

Purtroppo, non si può semplicemente convogliare il formato mp4 tra istanze avconv: "[mp4 @ 0x80846c0] muxer non supporta output non ricercabili"


Grazie, lo proverò stasera. Mi chiedo se esiste un comando che si comporta come un buffer? Attende il completamento del comando che scrive su stdin prima di passare tutto a stdout. Con cerca su stdout. Sarebbe utile. avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M,

1
Il messaggio di errore che ho aggiunto è specificamente correlato al tentativo di utilizzare le pipe con avconv, poiché le pipe sono intrinsecamente non ricercabili. La cosa migliore da fare è individuare temp.mp4 su un tmpfs o su un file system simile in memoria. / dev / shm / è un buon candidato per questo, se uno ha abbastanza RAM.
rmsr,

Per quanto riguarda le tubazioni, probabilmente puoi farlo con le pipe denominate aka fifo. Cerca mkfifo. In sostanza, si utilizza un file come memoria temporanea per stout.
Sparhawk,

Questa soluzione funziona anche per ffmpeg
c97,

8

A partire da questo ticket n. 1979 su ffmpeg bugtracker la soluzione più semplice è quella di correggere questo bug o aggiungerlo manualmente -fflags +genptsalla riga di comando.

Cioè cambia

ffmpeg -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv

per

ffmpeg -fflags +genpts -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv

1
Questo mi dà ancora lo stesso errore: /
Felix

funziona per me con la avconvversione 0.8.16, fino a quando non viene visualizzato uno strano Can't write packet with unknown timestampalla fine del file. Strano.
Malat,

2
Assicurati che -fflagssia usato come opzione di input: deve andare prima del tuo -i input. Ma probabilmente non avrebbe funzionato affatto se non avessi messo +genptsnel posto giusto.
Peter Cordes,

Funziona bene anche con avconv9.18-6: 9.18-0ubuntu0.14.04.1
Elder Geek,

2

Grazie ad Andreas Cadhalpun ffmpegora ha un nuovo filtro: mpeg4_unpack_bframes(vedi rif ). Questo vi permetterà di sbarazzarsi del messaggio: Invalid and inefficient vfw-avi packed B frames detected.

L'utilizzo è semplice come:

ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.