MediaElement.js - Flash视频无法播放直到完全加载

时间:2011-02-20 18:09:24

标签: javascript flash video video-streaming m4v

我有一个问题,MediaElement.js(我的flash视频播放器)没有播放我的.m4V视频文件(使用ffmpeg编码),直到视频完全加载

我已经使用各种第三方视频文件对其进行了测试,这些视频文件在完全加载之前可能会立即播放。只有我的文件没有:(

当使用html5视频解决方案播放时,它们会立即播放,而不是闪光灯后备。

这可能与视频编码的设置有关吗?我没有看到任何其他原因。

CODE:

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

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

如您所见,我没有指定选项,播放器处于默认设置。

希望有人以前曾经帮助过我,可以帮助我!

4 个答案:

答案 0 :(得分:10)

当您编码自己的视频并使用FFmpeg时,我建议使用'qt-faststart'。

这是一个包含在FFmpeg中的有用工具,它使用H.264视频重新排列文件,“这样moov原子就在数据前面,从而促进网络流”。基本上,它允许网络电影在完全下载之前开始播放。

使用以下ffmpeg目录启用它:

cd ~/ffmpeg
make tools/qt-faststart

用法(在你的ffmpeg编码之后):

qt-faststart input.foo output.foo

这应该允许您的播放器在下载时播放视频。

答案 1 :(得分:6)

如果没有按照自己想要的方式编制索引,则Flash无法始终播放MP4。

要修复您的文件,只需下载:QTIndexSwapper

答案 2 :(得分:2)

我用自己的MP4(h264 + AAC)编码文件尝试了qt-faststart,并且总是得到“文件中的最后一个原子不是moov原子”错误消息(并且没有输出文件) 。然后我假设我的文件没问题并且搜索了问题。经过几个小时的测试,我的假设被证明是错误的 - 事实上,似乎我的文件根本没有moov-atom ,而不是在开头或结尾!

为了成功解决这个问题,我首先使用ffmpeg来“重新生成”文件 - 也就是说,将原来的h264 + AAC轨道重新转换为新的MP4文件而不重新编码:

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

在此之后,新文件最后应该有适当的moov-atom。所以现在你可以使用qt-faststart将其移动到开头,正如Kit在他的回答中所解释的那样:

qt-faststart target_file_1.mp4 target_file_2.mp4

完成此操作后,当文件开始下载时,mediaelement会在点击播放按钮后立即播放我的所有视频! :)

如果你的问题是你已经在类似youtube的网站中拥有你的所有文件,你的托管是基于Linux的,ffmpeg不在那里,你不能自己编译它,你发现它有用得到一个静态的构建ffmpeg的。你可以在这里找到:

http://ffmpeg.gusari.org/static/(32位) 或者在这里: http://dl.dropbox.com/u/24633983/ffmpeg/index.html(64位)

不幸的是,在我使用的32位构建中,没有qt-faststart,不是二进制或源代码。在这种情况下,您可以从ffmpeg SVN下载它并直接用gcc编译它。我在我的超级廉价共享主机中成功完成了它。它似乎没有任何构建依赖项。或者您甚至可以尝试my own qt-faststart binary build并查看它是否适合您。

编辑:我刚刚发现在较新的版本中根本不需要qt-faststart。您可以使用以下选项直接使用ffmpeg进行编码:

-movflags +faststart 

答案 3 :(得分:1)

我想对John Dyer的评论进行一些扩展,并说使用 QTIndexSwapper不仅适用于MediaElement.js的Flash 后备/下降功能,而且适用于非Flash播放器。

我遇到的问题是在非Flash播放器中我的.mp4文件在开始播放之前必须加载完整的视频(我没有检查Flash版本,直到我让它在没有Flash的情况下工作)和QTIndexSwapper解决了这个问题。

我想指出这一点,因为当我第一次阅读评论时,我认为它只适用于Flash并且没有立即尝试。并不是说我从约翰戴尔那里拿走了任何东西,因为这是他的评论最终解决了我的问题,我只是想加入它,所以希望其他人不会犯我的错误。

如果有人有兴趣,我写了一个blog post about this problem和一个PHP类,它也应该修复它。