Criando vídeos MP4 prontos para streaming HTTP

25

Como posso converter some.flvou some.aviou some.wmvcom FFmpeg para ter a certeza que este vídeo será reproduzido e pesquisável no JW Player?

Abrahab
fonte

Respostas:

9

Esta é uma resposta para o último comentário feito por você @abrahab.

Você não precisa de mp4boxum arquivo para poder transmiti-lo via nginx. O módulo de streaming MP4 cuida dele independentemente do posicionamento dos átomos de moov ( mp4boxmuda o átomo de moov para o início do arquivo).


Agora, para o erro do servidor 500, você está usando a opção "-frag" no mp4box? O módulo de streaming MP4 não pode ler arquivos MP4 fragmentados. Um bom uso mp4boxpara pseudo streaming é intercalar os vídeos para uma melhor busca. A mudança de átomos de Moov é uma vantagem adicional.

Eu sempre faço isso em mp4boxum arquivo codificado em FFmpeg

MP4Box -add MyVideo.mp4 -isma Myvideo-box.mp4

Isso também intercalará o arquivo MP4 em 500 milissegundos de pedaços por padrão.

Vineet
fonte
1
Para fazer arquivo "in-place" intercalação sem ter que criar um novo arquivo, usar diretamenteMP4Box -isma -inter 500 Myvideo.mp4
Vineet
45

H.264 em MP4

Geralmente, você deseja criar um vídeo x264 em um contêiner MP4. Esta opção é suportada por basicamente qualquer dispositivo e navegador.

O seguinte deve ser suficiente. Certifique-se de substituir o nome da entrada e as opções de CRF. O último define a qualidade, onde os valores sãos variam de 19 a 25 - menor significa melhor qualidade, mas também maior taxa de bits:

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -movflags faststart output.mp4

Você também pode usar o Handbrake para codificação, se desejar da GUI.

Usando a faststartopção

Agora, o que você precisa fazer é mover o átomo MOOV do contêiner MP4 para o início. Esse átomo (em essência, uma unidade de dados no contêiner MP4) contém metadados importantes sobre os próprios fluxos de vídeo / áudio. -movflags faststartdeve fazer exatamente isso.

Se sua versão do FFmpeg não tiver essa opção, considere a atualização. Se você não pode atualizar, você pode conseguir o mesmo com qualquer uma das ferramentas abaixo:

  • QTIndexSwapper , um aplicativo Adobe AIR

  • MP4Box , de código aberto e gratuito, executando um comando semelhante ao seguinte, onde você pode alterar o intervalo (aqui, 500):

    mp4box -inter 500 input.mp4

  • qt-faststart no Python , que funciona em qualquer lugar onde o Python está instalado.

    qtfaststart input.mp4

É sobre isso.

Controle de taxa de bits / qualidade

Agora, é claro, para o streaming, você pode realmente restringir a taxa de bits para permanecer dentro de certos limites. Você pode ler mais sobre isso no meu post sobre métodos de controle de taxas .

Por exemplo, adicionando -maxrate 2M -bufsize 2Màs opções de codificação, você limita a codificação a 2 Mbit / s, o que pode ser suficiente para vídeo 720p. A taxa de bits necessária dependerá, é claro, de quão complexo é o conteúdo. Isso leva algumas tentativas e erros.

slhck
fonte
obrigado, eu faço tudo da mesma maneira, mas parece que o problema ainda está com o vídeo :( eu faço ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4isso mp4boxe o mp4 não pode procurar e o relatório nginx 500 internal server errorpara o parâmetro start mais que 0. quando o vídeo é codificado sem -vcoded libx264(codificador padrão do mp4) todo o arquivo de trabalho (mas quality! sick!) :( (desculpe, agora, não é permitido que você responda com um
voto positivo
Parece um problema de plug-in h.264 no NginX, em vez de qualquer problema de conversão de vídeo. Eu não sou especialista em streaming de vídeo na web em si, mas vejo que você já perguntou sobre isso no Stack Overflow? stackoverflow.com/questions/11079748/…
slhck 18/06/12
Também estou pensando que talvez o nginx não consiga ler corretamente este formato de vídeo. o vídeo do youtube também é reproduzido bem. sim, me perguntam na pilha sobre o problema nginx, mas parece não haver respostas. :(
abrahab 18/06/12
3
+1 para -movflags faststartexatamente o que eu precisava
andrew
o link está inoperante, é necessário usar o web.archive.org: web.archive.org/web/20140201142344/http://www.longtailvideo.com/…
malat
5

Você pode simplesmente converter um AVI ou MP4 não streamable, também sem recodificar tudo, fazendo o seguinte:

ffmpeg -i INPUT.mp4 -c copy -movflags faststart STREAMABLE_OUTPUT.mp4

Não há necessidade de recodificar nada, porque apenas o átomo moov precisa ser movido.

user769852
fonte
-1

Você pode tentar isso com ffmpeg:

ffmpeg.exe -i "INPUT_FILE.AVI" -threads 2 -s 800x600 -r 25.00 -threads 1 -pix_fmt yuv420p -g 300 -qmin 3 -b 2048k -async 1 -acodec pcm_s16le -ar 22050 -ac 1 -ab 128k -y "OUTPUT_FILE.mp4"
Tomás Hernández
fonte
5
Áudio estéreo PCM de 22 kHz para streaming de vídeo na Internet? Não parece muito eficiente. E por que você definiria a taxa de bits do áudio para 128k?
slhck
@slhck, você pode alterar 22k para 44k substituindo "-ar 22050" por "ar 44100"
Searush
1
@ SEARAS O problema não é a taxa de amostragem. É o fato de que o áudio é estéreo PCM descompactado. Para streaming na Internet. Isso não aparece.
slhck
Esta resposta é de qualidade muito baixa e deve ser removida. Os parâmetros podem alterar a taxa de quadros, a resolução de vídeo e a taxa de amostragem de áudio do conteúdo e produzir resultados ineficientes ou de baixa qualidade (o ffmpeg pode escolher parâmetros mais seguros ou melhores). O desempenho também é prejudicado pela limitação de menos threads e nem funciona com o -acodec pcm_s16le(erro Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument:). Um bom motivo, como um rascunho da IETF, para a escolha exata desses parâmetros também parece estar ausente.
LiveWireBT