Pergunta

Estou tendo um problema: MediaElement.js (meu reprodutor de vídeo em flash) não reproduz meus arquivos de vídeo .m4V (codificados usando ffmpeg) até que o vídeo seja totalmente carregado.

Eu testei isso com vários arquivos de vídeo de terceiros que parecem ser reproduzidos imediatamente antes de serem completamente carregados.Somente meus arquivos não :(

Quando reproduzidos usando a solução de vídeo HTML5, eles são reproduzidos imediatamente, mas não no flash substituto.

Isso pode ter a ver com as configurações em que o vídeo está sendo codificado?Não vejo outro motivo.

CÓDIGO:

<video id="player1" src='BriefTour.m4v' type="video/mp4" preload="none"></video>

<script>
var videoPlayer = MediaElement('player1',{
  success:function(me){me.play();}              
});
</script>

Como você pode ver, não estou especificando nenhuma opção, o player está nas configurações padrão.

Espero que alguém tenha encontrado isso antes e possa me ajudar!

Foi útil?

Solução

Como você está codificando seus próprios vídeos e usando FFmpeg, sugiro usar 'qt-faststart'.

Esta é uma ferramenta útil incluída no FFmpeg que reorganiza um arquivo com vídeo H.264, “de forma que o átomo moov fique na frente dos dados, facilitando assim o streaming em rede”.Basicamente, ele permite que os filmes da web comecem a ser reproduzidos antes de serem baixados completamente.

Habilite-o com o seguinte diretório ffmpeg:

cd ~/ffmpeg
make tools/qt-faststart

Uso (após a codificação ffmpeg):

qt-faststart input.foo output.foo

Isso deve permitir que seu player reproduza o vídeo enquanto o download ainda está sendo feito.

Outras dicas

O Flash nem sempre consegue reproduzir MP4s se eles não estiverem indexados da maneira desejada.

Para corrigir seu arquivo, basta fazer o download: QTIndexSwapper

Eu tentei o qt-faststart com meus próprios arquivos codificados em MP4 (h264 + AAC) e sempre recebia um "o último átomo no arquivo não era um átomo moov"mensagem de erro (e nenhum arquivo de saída).Eu estava presumindo que meus arquivos estavam ok e procurei o problema em outro lugar.Depois de horas de testes, minha suposição provou estar errada - na verdade, parece meus arquivos não tinham moov-atom, nem no começo nem no fim!

Para corrigir isso com sucesso, usei o ffmpeg primeiro para "regenerar" o arquivo - ou seja, remixar as faixas h264 + AAC originais em um novo arquivo MP4 sem recodificá-lo:

ffmpeg -i souce_file.mp4 -acodec copy -vcodec copy target_file_1.mp4

Depois disso, o novo arquivo deverá ter seu moov-atom adequado no final.Então agora você pode usar qt-faststart para movê-lo para o início, como Kit explicou em sua resposta:

qt-faststart target_file_1.mp4 target_file_2.mp4

Depois de fazer isso, o mediaelement reproduz todos os meus vídeos logo após clicar no botão play, quando o download do arquivo começa!:)

Se o seu problema é que você já tem todos os seus arquivos em um site semelhante ao do YouTube, sua hospedagem é baseada em Linux, o ffmpeg não está lá e você não pode compilá-lo sozinho, você achará útil obter uma compilação estática do ffmpeg.Você pode achar aquilo aqui:

http://ffmpeg.gusari.org/static/ (32 bits) ou aqui:http://dl.dropbox.com/u/24633983/ffmpeg/index.html (64 bits)

Infelizmente, na versão de 32 bits que usei não havia qt-faststart, nem como binário nem como código-fonte.Neste caso você pode baixá-lo do ffmpeg SVN e compilá-lo diretamente com o gcc.Fiz isso com sucesso em minha hospedagem compartilhada ultra-el-barata.Parece não ter nenhuma dependência de construção.Ou você pode até tentar minha própria compilação binária qt-faststart e veja se funciona para você.

EDITAR: Acabei de descobrir que nas versões mais recentes não há necessidade de qt-faststart.Você pode codificar diretamente com ffmpeg usando a seguinte opção:

-movflags +faststart 

Eu queria expandir um pouco o comentário de John Dyer e dizer que usando QTIndexSwapper não é apenas para Flash funcionalidade fallback/fallfoward do MediaElement.js, mas também funciona para o player não-Flash.

O problema que tive foi no player não Flash, meu arquivo .mp4 precisava carregar o vídeo completo antes de começar a ser reproduzido (só verifiquei a versão do Flash depois de fazê-lo funcionar sem Flash) e o QTIndexSwapper resolveu o problema.

Eu queria salientar isso, pois quando li o comentário pela primeira vez, pensei que ele se aplicava apenas ao Flash e não tentei imediatamente.Não que eu esteja tirando algo de John Dyer, pois foi o comentário dele que resolveu meu problema no final, eu só queria acrescentar algo para que outros não cometam meu erro.

Se alguém estiver interessado eu escrevi um postagem no blog sobre esse problema e sobre uma classe PHP que também deve corrigir isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top