8

我有一个问题,MediaElement.js(我的 Flash 视频播放器)在视频完全加载之前不会播放我的 .m4V 视频文件(使用 ffmpeg 编码) 。

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

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

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

代码:

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

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

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

希望有人以前遇到过这个并且可以帮助我!

4

4 回答 4

10

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

这是 FFmpeg 附带的一个有用的工具,它可以重新排列带有 H.264 视频的文件,“这样 moov atom 位于数据前面,从而促进网络流式传输”。基本上,它允许网络电影在完全下载之前开始播放。

使用以下 ffmpeg 目录启用它:

cd ~/ffmpeg
make tools/qt-faststart

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

qt-faststart input.foo output.foo

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

于 2011-02-22T18:25:47.737 回答
6

如果 MP4 没有按照它想要的方式编入索引,Flash 就不能总是播放它们。

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

于 2011-02-22T02:54:36.850 回答
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 编译它。我在我的超便宜共享主机中成功地做到了。它似乎没有任何构建依赖项。或者您甚至可以尝试我自己的 qt-faststart 二进制构建,看看它是否适合您。

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

-movflags +faststart 
于 2013-03-15T19:35:47.923 回答
1

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

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

我想指出这一点,因为当我第一次阅读该评论时,我认为它仅适用于 Flash,并没有立即尝试。并不是说我要从 John Dyer 那里拿走任何东西,因为他的评论最终解决了我的问题,我只是想补充一下,希望其他人不会犯我的错误。

如果有人感兴趣,我写了一篇关于这个问题的博客文章以及一个应该修复它的 PHP 类。

于 2013-02-07T17:08:14.920 回答