ffmpeg - Come copiare | estrarre le impostazioni di codifica dal file multimediale esistente?


19

Volevo poterlo fare più volte ora, quindi chiedo.

Se ho un video esistente o un file audio, ffmpeg, mplayere altri lettori multimediali in grado di rilevare almeno una parte di esso è "propreties", come contenitore, codec e il bitrate utilizzato, probabilmente varie qualità e le impostazioni specifiche di codifica, etc.

Come posso estrarre queste impostazioni da un file esistente per usarle (direttamente) per la codifica con ffmpeg?

Ad esempio, ho ottenuto un mkvvideo codificato x264con alcune impostazioni e un altro avifile non compresso . Vorrei "copiare" le impostazioni di codifica utilizzate per il file mkv x264 per transcodificare l'avi con le stesse impostazioni.

Nota: sto cercando un modo che non dovrebbe includere alcun lavoro umano con la "traduzione" delle impostazioni da un decodificatore all'encoder. Va bene se devo prima estrarre le impostazioni e salvarle da qualche parte, ma vorrei essere in grado di alimentare semplicemente le opzioni di lettura a una riga di comando o un file di configurazione predefinito per ffmpeg.


Beh, probabilmente si potrebbe ordinare attraverso l'uscita di ffprobe(in particolare con l' -show_streamse -show_formatopzioni) e utilizzare queste informazioni per lo script l'importante roba
evilsoup

1
Spesso l'utilizzo delle stesse impostazioni, come bitrate (il tentativo di copiare il bitrate esatto sembra essere popolare tra gli utenti), non si tradurrà in una qualità ottimale. Ovviamente non ho idea di come sia il tuo input tipico, ma con x264 -crfsi consiglia generalmente l'uso dell'opzione. Vedi la guida alla codifica FFmpeg e x264 .
llogan

Non riesco a trovare nulla sulla codifica delle impostazioni nell'output di ffprobe :(
thelolcat

Essa mostra solo il numero di ristruttura, ma non le altre impostazioni come mediainfo fa
thelolcat

La sintassi di input con ffmpeg è diversa dai campi dei metadati. ad esempio, è possibile leggere channels:6da un file video, ma per codificarlo è necessario utilizzare l'interruttore -ch:6. Alcuni switch usano 1 lettera, altri ne usano due, ecc.
jiggunjer,

Risposte:


10

Non esiste un modo automatico per farlo. Devi guardare i parametri del file originale e applicarli al file di output.

Nella maggior parte dei casi, questi saranno i seguenti:

  • Formato contenitore (MP4, MKV, ...)
  • Codec video e audio (H.264, H.265, ...)
  • Audio-specifica:
    • Numero di canali audio
    • Frequenza di campionamento audio
    • Bitrate audio
  • Video-specifica:
    • Profilo e livello (per garantire la compatibilità, vedere qui )
    • Limitazioni massime del bitrate (ad es. Per H.264 )
    • Massima risoluzione video, modifica tramite -filter:v scaleo-s:v
    • Framerate, cambia via -filter:v fps -r
    • Sottocampionamento Chroma, modifica tramite -pix_fmt(ad esempio, -pix_fmt yuv420pdovrebbe darti la migliore compatibilità)
    • Dimensione GOP (distanza tra i frame IDR), impostata tramite -g
    • Altre impostazioni di codifica specifiche

Ma anche se tutto va bene, alcuni dispositivi potrebbero richiedere informazioni proprietarie specifiche incorporate nel bitstream.


Per quanto riguarda l'attività specifica dell'uso x264, questo non sarà banale. Non sono a conoscenza di un singolo script che si occuperebbe di queste attività, che di solito vengono eseguite manualmente. Per la maggior parte delle informazioni sulle impostazioni di codifica, su Unix / Linux o OS X, è possibile utilizzare mediainfocon alcuni trucchi Bash.

Ad esempio, per un video con codifica x264 in un file MP4:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

Questo produrrà un elenco di opzioni x264:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

È quindi possibile passare manualmente queste opzioni al file binario x264.

Se passi attraverso FFmpeg, è un po 'più complicato, poiché non tutte le opzioni di x264 possono o dovrebbero essere mappate in questo modo. Si noti che spesso anche una semplice preimpostazione, messa a punto e specifica del profilo (come visto in x264 --fullhelpe la guida alla codifica x264 ), e specificare il livello CRF è sufficiente.

E questo non sta nemmeno prendendo in considerazione l'audio, dove fortunatamente non ci sono molte opzioni.


Quindi non è possibile con ffprobe o ffmpeg?
thololcat,

No, non è possibile farlo direttamente con ffprobe / ffmpeg. In caso di video con codifica x264, utilizzerei l' mediainfooutput e mapperei queste opzioni con ffmpeg -x264-params. (Vedi anche la guida alla codifica x264 ). Ma se vuoi una soluzione generale per tutti i tipi di codec / codificatori o formati contenitore, allora dovresti scrivere uno script moderatamente sofisticato che esegua la conversione.
slhck,
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.