Qual linha de comando do ffmpeg produz vídeos mais compatíveis em todos os dispositivos?


15

Então, eu tenho usuários dizendo vídeos H264 que os MP4 não reproduzem áudio no IPad da Apple e eu luto para que os vídeos MP4 sejam reproduzidos corretamente no Android também.

Existem duas linhas de comando diferentes: qual linha de comando é a que eu deveria estar usando.

-profile:v baseline -level 3.0

E:

-vpre baseline

Qual devo usar para que funcione em todos os dispositivos?

Eu também li que poderia ser a taxa de bits de áudio minha taxa de bits atual é

-ab 192k

Talvez eu deva baixá-lo para

-ab 160k

Linha de comando usada para codificar o áudio MP3 em arquivos MP4.

"C:/server/ffmpeg/bin/ffmpeg.exe" -y -i Z:/server/websites/ps/public_www/media/com_hwdmediashare/files/55/ac/fb/54bbf30bb11a0f6b9dc832114c26fd29.mp4 -strict experimental -acodec libmp3lame -ar 44100 -ac 2 -ab 192k -s 480x360 -aspect 16:9 -r 24000/1001 -vcodec libx264 -b:v 1000k -minrate 800k -maxrate 1000k -bufsize 800K -crf 18 -preset veryslow -f mp4 -threads 0 -movflags +faststart Z:/server/websites/ps/public_www/media/com_hwdmediashare/files/55/ac/fb/98382d43d31d4ff91ea44cb2aa1bbc49.mp4 2>&1

Respostas:


25

Primeiro, você deve entender a diferença entre o uso de perfis FFmpeg e as opções diretas da linha de comando. -vpreusa um .ffpresetarquivo localizado em /usr/share/ffmpeg/ou onde o ffmpeg foi instalado. É uma série de pares opção = valor e, no seu caso, você teria que defini-lo você mesmo (pelo menos não conheço uma baselinepredefinição fornecida com ffmpeg).

Eu recomendaria não usar predefinições, a menos que você as tenha criado e saiba quais são as opções da linha de comando. Uso o ffmpeg há anos e nunca usei predefinições - nunca precisei.

Uma linha de comando típica para gerar vídeo H.264 compatível com a maioria dos dispositivos seria:

ffmpeg -i <input> \
  -c:v libx264 -crf 23 -profile:v baseline -level 3.0 -pix_fmt yuv420p \
  -c:a aac -ac 2 -b:a 128k \
  -movflags faststart \
  output.mp4

Algumas notas:

  • H.264 / AAC é a melhor combinação para um amplo suporte em HTML5. Os navegadores que não possuem decodificadores H.264, no entanto, também precisam de um vídeo VP8 / Vorbis. Para alguns exemplos de linha de comando, consulte esta resposta . Veja também a página de suporte do navegador da Wikipedia para outros codecs.

  • O H.264 também funciona bem em dispositivos móveis.

  • As opções -profile:v baselinee -level 3.0são necessárias apenas para dispositivos móveis antigos que não podem lidar com os recursos intensivos de CPU do H.264. Normalmente, você pode deixá-los de fora ou usar -profile:v main.

  • O CRF define a qualidade (18–28 é uma faixa razoável, menor significa melhor qualidade). Obviamente, você também pode usar uma taxa de bits fixa com -b:v 1000kou similar. Escolha uma taxa de bits que corresponda à resolução do vídeo. Alguns dispositivos de baixa energia podem não ser capazes de lidar com taxas de bits desnecessariamente altas.

  • A -movflags faststartopção é essencial para o streaming, pois move os metadados do contêiner para o início do arquivo, em vez de deixá-lo no final. Isso permitirá que a reprodução inicie imediatamente, em vez de ter que esperar o carregamento completo do arquivo.

No entanto, tudo se resume a encontrar o menor denominador comum para todos os dispositivos que você está segmentando, que nem sempre existem. Certamente você não gostaria de usar outro codec (isto é, pior ) que o H.264. De fato, também não seria aconselhável oferecer vídeo codificado na linha de base para clientes que possam decodificar o perfil Principal ou Alto. Você trocaria qualidade contra complexidade de decodificação reduzida.

Pela minha experiência, os dispositivos Android podem reproduzir o Baseline H.264 com áudio AAC-LC em um contêiner MP4. Eu nunca tive problemas com isso. De fato, alguns dispositivos também podem reproduzir perfis mais altos, embora não sejam oficialmente suportados. O iOS geralmente também suporta a linha de base H.264, mas você também pode usar o perfil principal em alguns dispositivos. Veja esta postagem (que está um pouco desatualizada) para obter algumas diretrizes.

Se você tem usuários com problemas de reprodução, precisa descobrir qual vídeo está causando problemas e obter mais detalhes sobre o hardware e o software do player que estão usando. Poderíamos falar sobre a solução de problemas nesse caso específico.


1
Obrigado por uma resposta tão detalhada, eu continuo relendo-o :) Também codifico com -acodec libmp3lame -ab 160k e os usuários que usam dispositivos ipad da apple estão dizendo que poderiam assistir ao vídeo, mas não ouvem som, então suponho que seja algo a ver com o codec ou taxa de bits de áudio. Usuários de Android e Windows dizem que está tudo bem e que têm áudio no fluxo de vídeo, por isso não sei por que usar libmp3lame em vez de aac faria com que os usuários da apple não tivessem áudio no vídeo.
C0nw0nk 31/12/14

Eu raramente vi áudio MP3 usado em contêineres MP4. Talvez o AAC seja a escolha mais segura.
slhck

Bem, eu só estou usando MP3 porque eu recebi bit_rate, erros de altura e largura com aac eu mudei para libmp3lame e todos esses erros param e então os usuários da Apple dizem que não têm áudio, mas todos os outros podem assistir o mesmo arquivo e está tudo bem com o som em todos os outros dispositivos, talvez eu tenha encontrado um bug que saiba :( E, de acordo com o apple MP3, deve ser bom developer.apple.com/library/mac/documentation/…
#

@ user2068371 Esse link refere-se ao fluxo de transporte MPEG-2, não ao formato de contêiner MP4.
Llogan

1
@ user2068371 Nunca tive problemas com o MediaElementjs. H.264 e MP3 não são suportados em todos os navegadores . Para vídeo HTML5 especificamente, sempre use H.264 / AAC e possivelmente VP8 / Vorbis como substituto. Se você tiver problemas com uma conversão AAC, faça uma nova pergunta sobre isso e inclua também a saída completa da linha de comando.
slhck
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.