我有一个问题,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>
如您所见,我没有指定选项,播放器处于默认设置。
希望有人以前曾经帮助过我,可以帮助我!
答案 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类,它也应该修复它。