Como criar um arquivo de vídeo MPEG2 com a mais alta qualidade possível usando o FFMPEG?

16

Tenho um arquivo WMV (v9 (WMV3), 960x720, 30.000030 fps, planar YUV 4: 2: 0, produzido pelo PowerPoint 2010) e preciso convertê-lo em MPEG2 - o único formato que meu TVset pode ler em uma unidade flash USB (Eu também tentei MP4 / h.264, AVI / XVID - nada além de MPEG2 funciona).

Eu consegui o trabalho com simples

ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"

mas a qualidade do resultado é terrível (distorções visuais claramente visíveis são introduzidas) e a reprodução não é suave (muito lenta em alguns momentos).

Eu também tentei

ffmpeg -i "in.wmv" -c:v mpeg2video -pix_fmt yuv420p -me_method epzs -threads 4 -r 30.000030 -g 45 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -s 960x720 -b 2500k -bt 300k -async 1 -y "out.mpg"

(Encontrei isso em algum lugar da Internet e modifiquei um pouco - mudei a resoultion, a taxa de atualização e o formato de saída (de VOB para MPG) - com sucesso, mas a qualidade ainda é muito ruim.

Quais parâmetros eu tenho que usar para economizar o máximo de qualidade possível? A taxa de compressão não importa, mesmo o aumento no tamanho do arquivo é aceitável.

Outra coisa de que realmente preciso (escolhi não incluí-lo no título da pergunta para evitar que seja muito específico, mas eu apreciaria que isso fosse considerado nas respostas) é adicionar puro silêncio como trilha sonora - não há som no original, mas o aparelho de TV reclama e eu gostaria de me livrar dessa reclamação. Eu gerei um arquivo OGG Vorbis de silêncio do mesmo tamanho (segunda precisão) usando o Audacity, mas não consigo mesclá-lo ao vídeo:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg

e mesmo nua

ffmpeg -i in.mpg -c:v copy -out.mpg

fornece erros de "buffer underflow" e "pacote muito grande". (in.mpg são os arquivos produzidos pelo mesmo binário FFMPEG e pelo mesmo arquivo WMV de origem, usando os dois primeiros comandos da pergunta).

Estou usando uma compilação Zeranoe FFMPEG no Windows 7.

Ivan
fonte
2
Alguém vai pedir um log de saída completo.
dstob
Qual aparelho de TV exatamente? Pode ler H.264, apenas um perfil diferente.
slhck
@slhck O televisor está Philips 42PFL3606H/58codificando para H.264 com ffmpeg -i "in.wmv" -sws_flags lanczos+accurate_rnd -c:v libx264 -crf 20 -preset slow -profile:v baseline -level 3.0 -pix_fmt yuv420p -tune fastdecode -x264-params keyint=240:min-keyint=20 "out.mp4"- o perfil é o mais baixo que eu conheço e ainda mais ajustes são usados ​​para tornar a reprodução do arquivo resultante uma tarefa mais fácil.
Ivan
1
De acordo com o manual, a TV suporta MPEG-4 Visual e H.264. Se o perfil da linha de base não funcionar, não tenho certeza do que funciona. Mas as TVs são muito exigentes.
slhck

Respostas:

16

O problema é que a taxa de bits padrão para o MPEG-2 é bastante baixa (como na maioria dos outros codificadores de vídeo em ffmpeg, sendo o H.264 uma exceção). O MPEG-2 também não é a melhor escolha como codec atualmente.

Melhor qualidade para MPEG-2

Você tem algumas opções se quiser usar o MPEG-2:

  • Aumente a taxa de bits. Você está usando agora -b:v 2500k. Se for um vídeo em HD, você não irá longe com apenas 2,5 MBit / s. Você precisa pelo menos o dobro disso ou mais para fazer o resultado parecer bom. Por exemplo, use -b:v 6000k -target pal-dvd.

    Para 720p, acho que você ainda deve usar uma taxa de bits mais alta. Lembre-se de que os DVDs usam MPEG-2 e vêm com cerca de 4,7 GB por 2 horas de filme, então você acaba com cerca de 5 a 8 MBit / s. O MPEG-2 realmente não é muito eficiente em compactação e funciona melhor em taxas de bits mais altas.

  • Use uma configuração de qualidade específica. Mude -b:v …para -qscale:v 2. O número aqui varia de 1 a 31 e superior significa menor qualidade. Não faz sentido ir além de 4 ou 5. Se você não se importa com a taxa de bits, comece com 2 e veja se isso funciona para você.

Mexer com o número de quadros B, método de estimativa de movimento ou tamanho de GOP pode alterar um pouco a qualidade, mas não resultará em grandes mudanças.

Áudio silencioso

Use -f lavfi -i aevalsrc=0para gerar um fluxo de áudio silencioso. Por exemplo:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"

Pode ser necessário adicionar -target pal-dvdao comando acima para forçar um determinado tamanho de buffer.

Eu escolhi o MP3 como codec. Os arquivos MPEG não podem conter áudio que não seja o áudio MPEG Layer I e II, bem como fluxos PCM, portanto, o uso de um arquivo silencioso Ogg Vorbis não funcionará, a menos que você converta também o fluxo de áudio (que não é o que você faz ao usar -c:a copy) .

Use um codec de vídeo diferente

Estou surpreso que uma TV que reproduza arquivos de vídeo leia MPEG-2, mas nada mais. Pelo menos o vídeo MPEG-4 Parte II deve ser suportado (é o que você conhece como "DivX" - um codificador MPEG-4 Parte II). Então você pode tentar:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"

Na verdade, sua TV também suporta H.264, mas apenas um determinado perfil. Tente usar o baselineperfil, por exemplo:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libx264 -profile:v baseline -crf 23 -c:a aac -strict experimental "out.mp4"

No exemplo acima, usei a opção CRF para definir a qualidade em vez de qscale. Consulte o guia de codificação H.264 para obter mais informações.

slhck
fonte
"Mexer com o número de quadros B, método de estimativa de movimento ou tamanho de GOP pode alterar um pouco a qualidade, mas não resultará em grandes mudanças." - posso apenas transformar cada quadro em um quadro B e não usar estimativa de movimento com o MPEG2? O vídeo tem muitas partes MUITO dinâmicas.
Ivan
Eu tentei a primeira linha de comando que você sugere ( ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4") - ela codifica cerca de 100 quadros e começa a inundar a tela com erros como [mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761e [mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it.
Ivan #
@Ivan Você altera a taxa de bits com -b:v. Adicionado à minha resposta. Em relação às configurações do codificador: Você não pode transformar todos os quadros em quadros B. Além disso, você precisa de estimativa de movimento - quanto mais exaustivo o método, melhor a compactação. Mas se for um vídeo dinâmico, a primeira coisa que você desejará é aumentar significativamente a taxa de bits. As configurações de codificação realmente não têm muito impacto. Quanto ao seu erro, você tem certeza de que este é o erro do comando correto? Um [mpeg]erro só pode acontecer se o seu arquivo de saída for .mpg, não quando for .mp4.
Slhck 5/11
Copiei = colei uma parte errada, @slhck, estou usando, é ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"claro.
Ivan
1
-target pal-dvdresolve o problema, -bufsizenão funciona (eu tentei -b:v 7M -bufsize 7M -maxrate 7M).
Ivan #
0

Eu diria imediatamente que se o tamanho do arquivo realmente não importa, experimente aumentar a taxa de bits.

Para o áudio silencioso, você pode querer usar o ffmpeg, não sei o suficiente sobre o Audacity para fazer qualquer comentário. Eu já usei isso antes.

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.aac

No entanto, isso não funcionará para você, pois você está usando o contêiner mpg, então você pode tentar.

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.mp3

Pareceu funcionar para mim.

dstob
fonte
Definir a duração não é necessário, pois o ffmpeg usará o que for necessário para o vídeo.
slhck
Eu mantive as coisas no processo de duas etapas, como Ivan havia feito. Se você deixar de fora a duração no meu comando, não sei quanto tempo o ffmpeg seria executado (provavelmente mais do que você gostaria).
perfil completo de Dstob