有人遇到过这个奇怪的HTML5视频播放问题吗?黑色元素,无法加载。

3

场景

我有一个视频元素:

<video class=​"media video" src=​"http:​/​/​localhost:​3000/​uploads/​medias/​2014/​08/​11/​nahNYjjysJBuwSsxj_2" loop>​</video>​

使用jQuery,我可以将其移动到DOM中(附加和分离它)。
有时,在新的附加操作(使用 $.appendTo )之后,视频会变成黑色,并且无法通过编程方式播放它。也就是说:即使我尝试以下操作也无法成功:
var video = $('video')[0]; // using jQuery I get the reference to the DOM element
video.load(); // nothing happens
video.play(); // nothing happens
video.pause(); // nothing happens

我也在它上面有一个监听器。
$('video').on('canplay', function () {/*...*/});

这个代码从未被触发。

我尝试将URL更改为:

v.src = v.src + '?cache_bust=true'; 
// then
v.load(); v.play();

但是却没有任何反应。

注记

  • 页面上有多个4-5个视频元素,我用类似的方式移动它们
  • 我总是将video元素附加到可见区域,然后尝试播放它们
  • 服务器设置支持范围请求和缓存。

在正常情况下,它们看起来像:

好的请求

在失败的情况下,请求如下:

输入图像说明

Chrome 显示pending,服务器永远不会报告进入的请求。

问题

  • 有人遇到过这个/相似的问题吗?
  • 是否存在其解决方法?
  • 如果没有:是否存在可靠的解决方法?

发现(更新)

随着我深入挖掘。我意识到这可能是一个Chrome/ium问题。因此,我找到了以下页面:

所有这些都显示出存在已经持续1.5-4年的错误。看起来不太乐观。因此,我将深入搜索替代方案,并尝试以下方法:

  • 禁用视频缓存
  • 在每个视频隐藏时使用video.src = null; video.load();
  • 禁用byte ranges

你的控制台输出了什么?尝试在你的.load函数中添加某种回调,例如.load(function(){ console.log(1)})。顺便问一下,localhost:3000,这是RoR应用程序吗? - Y.Puzyrenko
控制台没有报告任何错误,加载永远不会完成,视频.readyState保持在0(HAVE_NOTHING)。这是一个meteor应用程序。服务支持缓存和范围请求。现在我正在禁用视频缓存,以查看问题是否仍然存在。主要问题是很难复制该问题,因为它只会偶尔发生。 - Matyas
@Matyas 嗨,我有一个类似的问题,你可以看一下我的问题吗?http://stackoverflow.com/questions/29093473/accept-ranges-not-working-with-chrome 和 http://stackoverflow.com/questions/29115886/avoid-range-header-while-requesting-for-video - Amogh
2个回答

1
你们的视频是什么格式?许多编码器,包括FFmpeg和MEncoder,会写入不太干净的mp4元数据。在大多数情况下,索引将被写在视频文件的末尾,而不是预期的文件开头。因此,在播放之前必须下载整个视频。可以使用一个名为“qt-fast start”的小而强大的工具在Linux下进行纠正。这个小程序已经方便地默认包含在FFmpeg安装的tools子目录中。

视频格式为mp4。第一次加载文件时,我可以看到Chrome进行范围请求,先读取第一部分,然后读取最后一小部分,以获取其元信息。此外,该问题似乎发生在启用缓存的情况下。我仍需要进行更多测试,尝试更多解决方法。如问题所述,我已经发现更多人在使用缓存的mp4格式视频数据时遇到了相同的问题。但不幸的是,我还没有确定确切的问题所在,无论是缓存/硬件解码/视频格式问题。 - Matyas
我不相信这是一个缓存问题。我们为其中一位客户实现了一个带有HTML5的视频门户网站,我们也遇到了您在下面描述的同样错误。解决方案是交换视频文件的索引。请看这里链接 - Sven Schürmann
好的,感谢您的建议。我正在创建转码脚本的过程中。将尝试使用qt-faststart和转码为webm。谢谢您的建议。顺便问一下:1.您是否使用了范围请求和缓存?2.您是否曾经移动视频元素/在同一页上多次显示相同的视频? - Matyas
我在视频门户中使用了一个视频播放器。要加载另一个视频,我更改了视频元素的“src”属性。我不确定您所说的范围请求是什么意思。如果您的意思是在视频中向前或向后跳过,则是的。对于另一个项目,我使用HTML 5和Flash回退构建了一个视频旋转木马。有许多视频播放器可以循环移动。视频播放没有任何问题。 - Sven Schürmann

0
如果您确实在使用Chrome,则可能与Chrome有关于视频的行为有关,即使用字节服务来获取视频流,然后在收到200 HTTP代码而不是更适合字节服务的206时出现混乱。
该问题似乎主要发生在重播视频时。 在这个其他线程中,您会找到更多信息: HTML5 video will not loop

有关解决方案的任何提示吗? - dakab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接