Android video.duration 直到 video.play() 才会加载

Posted

技术标签:

【中文标题】Android video.duration 直到 video.play() 才会加载【英文标题】:Android video.duration does not load until video.play() 【发布时间】:2012-04-10 10:07:49 【问题描述】:

我有一个 html5 视频,我试图在播放期间以特定间隔设置回调。视频从带有video.play()javascript 开始播放。现在我的代码监听'loadedmetadata' 事件,然后查询持续时间并设置这些回调。在移动 Safari 上运行良好,但在 android(2.3.4 和 2.3.7)上运行良好。

在 Android 上,'loadedmetadata' 似乎在持续时间实际可用之前发出。为了测试这一点,我在代码中记录了加载过程的每个步骤的持续时间,以查看实际可以读取的位置。在video.play() 和一个'timeupdate' 事件之后,video.duration 属性为 6000,无论使用的是什么视频。我用一个 mp4 文件和一个 3gp 文件对此进行了测试。一旦满足这些条件,就可以使用实际持续时间。

我发现这个其他帖子有类似的问题 [1]。没有被接受的最高投票答案是我最初是如何设置的,它在 ios 上运行良好。接受的答案也不起作用,并表明这是一个 webkit 问题。我记录了video.readyState 属性,并在视频开始播放之前看到它是'4',但持续时间在开始播放之前仍然不可用,并且第一个'timeupdate' 事件。

我们当前的解决方法是查询video.duration 值,并且仅在video.duration !== 6000 时设置事件回调。这很丑陋,我想深入了解它,以免这个黑客回来咬人。此处的讨论 [2] 似乎表明该问题可能与编码有关。也就是说,如果编码不正确,android 在文件加载之前不会正确读取元数据,或者可能根本不会正确读取元数据,它会以另一种方式计算持续时间。

我可以做些什么来让这个更干净,还是我现在坚持这个黑客?

[1]Problem retrieving HTML5 video duration

[2]http://www.broken-links.com/2010/07/08/making-html5-video-work-on-android-phones/

【问题讨论】:

我使用了v.addEventListener('durationchange', repos, false); 监听器来跟踪更改,但是是的...在许多 Android 版本上似乎是 WebView/Video 问题 移动设备有其自身的局限性,因此它们不会像桌面浏览器那样加载所有内容,在 android 浏览器中,在您播放之前不会调用视频,因为这样可以节省带宽并减少内存/缓冲区的使用..我认为你可以让它默认播放,然后使用一个脚本在 1-2 秒后停止视频......这应该符合你的目的.. 【参考方案1】:

Id 使用 setTimeout 调用函数以递归方式检查持续时间是否可用。

这样,该功能可以在任何信息可用时立即显示持续时间等。

【讨论】:

以上是关于Android video.duration 直到 video.play() 才会加载的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTML5 和 JavaScript 从视频中捕获帧

Android - 保持会话活动直到关闭(直到用户注销)

自动刷新android片段,直到满足条件

如何保存数据直到应用程序在android中卸载?

Android 上的 QApplication,从 JNI 开始,一直到 SEGFAULT

Android menuItem 不显示,直到你点击它......?