ffmpeg - Como copiar | extrair configurações de codificação do arquivo de mídia existente?


19

Eu queria poder fazer isso várias vezes agora, então pergunto.

Se eu tiver um arquivo de vídeo ou áudio existente ffmpeg, mplayere outros players de mídia puderem detectar pelo menos alguns de seus "bens", como contêiner, codec e taxa de bits usados, provavelmente várias configurações específicas de qualidade e codificação etc.

Como posso extrair essas configurações de um arquivo existente para usá-las (diretamente) na codificação com ffmpeg?

Por exemplo, recebi um mkvvídeo codificado x264com algumas configurações e outro aviarquivo não compactado . Gostaria de "copiar" as configurações de codificação usadas no arquivo x264 mkv para transcodificar o avi com as mesmas configurações.

Nota: Estou procurando uma maneira que não inclua trabalho humano com "traduzir" as configurações de um decodificador para o codificador. Tudo bem se eu precisar extrair as configurações primeiro e salvá-las em algum lugar, mas gostaria de poder simplesmente alimentar as opções de leitura em uma linha de comando ou predefinir o arquivo de configuração do ffmpeg.


Bem, você provavelmente poderia resolver através da saída de ffprobe(especialmente com o -show_streamse -show_formatopções) e usar essa informação para o script as coisas importantes
evilsoup

11
Freqüentemente, usar as mesmas configurações, como taxa de bits (tentar copiar a taxa de bits exata parece popular entre os usuários), não resultará em qualidade ideal. É claro que não tenho idéia de como é sua entrada típica, mas com o x264 o uso da -crfopção é geralmente recomendado. Consulte o Guia de codificação FFmpeg e x264 .
Llogan

Não consigo encontrar nada sobre as configurações de codificação na saída do ffprobe :(
thelolcat 3/15/15

Isso só mostra o número de reframes, mas não as outras configurações como mediainfo faz
thelolcat

A sintaxe de entrada com ffmpeg é diferente dos campos de metadados. por exemplo, você pode ler channels:6de um arquivo de vídeo, mas para codificá-lo, precisará usar o comutador -ch:6. Alguns switches usar uma carta, alguns usam dois, etc.
jiggunjer

Respostas:


10

Não há maneira automática de fazer isso. Você precisa observar os parâmetros do arquivo original e aplicá-los ao arquivo de saída.

Na maioria dos casos, estes serão os seguintes:

  • Formato do contêiner (MP4, MKV,…)
  • Codec de vídeo e áudio (H.264, H.265,…)
  • Específico de áudio:
    • Número de canais de áudio
    • Taxa de amostragem de áudio
    • Taxa de bits do áudio
  • Específico do vídeo:
    • Perfil e nível (para garantir compatibilidade, veja aqui )
    • Limitações máximas de taxa de bits (por exemplo, para H.264 )
    • Resolução máxima de vídeo, alteração via -filter:v scaleou-s:v
    • Taxa de quadros, alteração via -filter:v fps -r
    • Subamostragem de croma, alteração via -pix_fmt(por exemplo, -pix_fmt yuv420pdeve oferecer a melhor compatibilidade)
    • Tamanho GOP (distância entre os quadros IDR), definido via -g
    • Outras configurações específicas de codificação

Mas mesmo se você acertar tudo isso, alguns dispositivos podem exigir informações proprietárias específicas incorporadas ao fluxo de bits.


Quanto à tarefa específica de usar x264, isso não será trivial. Não conheço um único script que cuide dessas tarefas, que geralmente são feitas manualmente. Para obter mais informações sobre as configurações de codificação, no Unix / Linux ou OS X, você pode usar mediainfoalguns truques do Bash.

Por exemplo, para um vídeo codificado em x264 em um arquivo MP4:

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

Isso produzirá uma lista de opções x264:

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

Você poderia então passar manualmente essas opções para o binário x264.

Se você passar pelo FFmpeg, isso é um pouco mais complicado, pois nem todas as opções do x264 podem ou devem ser mapeadas dessa maneira. Note-se que muitas vezes uma simples especificação pré-definido, e sintonizar perfil fará bem (como visto na x264 --fullhelpe o guia de codificação x264 ), e dependendo do nível de CRF é o suficiente.

E isso nem leva em consideração o áudio, onde, felizmente, não existem muitas opções.


Portanto, não é possível com ffprobe ou ffmpeg?
Thelolcat

Não, não é diretamente possível fazê-lo com o ffprobe / ffmpeg. No caso de vídeo codificado em x264, eu usaria a mediainfosaída e mapeia essas opções para ffmpeg -x264-params. (Consulte também o guia de codificação x264 ). Mas se você deseja uma solução geral para todos os tipos de codecs / codificadores ou formatos de contêiner, precisará escrever um script moderadamente sofisticado que faça a conversão.
Slhck 6/12/2015
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.