在 iPad 上搜索 HTML5 视频

Posted

技术标签:

【中文标题】在 iPad 上搜索 HTML5 视频【英文标题】:HTML5 video seeking on iPad 【发布时间】:2011-04-15 16:11:46 【问题描述】:

我有一个带有自定义搜索栏的 html5 视频播放器,它在 iPhone(内联播放)和浏览器上运行良好。

它在 iPad 上的播放效果也很好,并且搜索栏会随着电影的播放而更新,但由于某种原因,我无法搜索。

所有值都是正确的,我正在尝试设置:

myPlayer.currentTime = XX;

很遗憾,iPad 拒绝设置 .currentTime 属性。

据我所知,浏览器和 iPad 之间的区别在我得到的浏览器上:

myPlayer.networkState = 3
myPlayer.readyState = 4

在 iPad 上我得到:

myPlayer.networkState = 2
myPlayer.readyState = 3

完全相同的代码,运行本地 MP4 视频。

知道为什么会这样吗?

干杯, 安德烈

【问题讨论】:

您能否发布设置当前时间的代码。我可以毫不费力地做到这一点。 这里:videoPlayerElement.currentTime = x * videoPlayerElement.duration /scrubberBg.width(); ...这在浏览器(其中几个)和 iPad 上有效,值可以跟踪,但未设置属性。我正在运行 3.2 我发现 ios 上的设置 video.currentTime 似乎是在用户操作之后进行的。在设置currentTime 之前发出alert() 或触摸事件似乎提供了正确的响应——当然除了它需要的用户交互。 【参考方案1】:

我在让 javascript 控制音频元素时遇到了各种各样的问题,并且对 currentTime 属性感到非常沮丧,以及 Apple 对什么构成直接用户启动事件的限制。

如果 iPad 上的 JavaScript 和 HTML5 视频播放存在某种奇怪的错误(或未记录的“功能”),我不会感到惊讶,这需要解决方法。根据我的经验,iPad 的处理方式比官方文档中的方式独特。

您应该检查视频元素的 errorbufferedseekableseeking 属性。查看您的 readyState 和 networkState 值,iPad 似乎认为视频尚未完全加载 - 这对于本地资源来说很奇怪。

缓冲可搜索应该等于整个视频的时间范围。寻求应该是真实的。这至少应该为您提供有关该问题的更多信息。

你用其他视频测试过吗? 可能是 iPad 有问题的视频存在某种编码问题。

除此之外 - 以前的 iPad OS 版本中存在一个错误,该错误破坏了设置 currentTime 属性的能力。您使用的是最新的操作系统版本吗?

【讨论】:

我正在使用 3.2(因为我不能将其限制为最新版本)并且我尝试了不同的视频源,但同样的问题:/【参考方案2】:

此问题与 video.currentTime 属性上使用的值有关。在我的具体情况下,我通过始终确保在查找期间使用具有 1 个十进制数字的浮点数来解决问题。

在 iOS 3.2 上将 video.currentTime 设置为零确实会将视频搜索到开头,但此后值不会更新 - timeupdate 事件仍会正常发送,但如果您尝试读取 currentTime,它将始终返回相同的值。

要寻找视频的开头使用0.1 而不是0,寻找12.2345 使用12.2

PS:您可以使用(+(12.2345).toFixed(1)) 将小数位数限制为1。

【讨论】:

我有同样的问题并尝试按照上面的方法进行四舍五入,但它似乎不适用于 IOS 6.1。【参考方案3】:

Kyle 的回答很好。我要补充一点,你不能假设seekable 属性是在任何特定事件之后填写的。这意味着您不能等待loadedmetadatacanplay 或任何其他事件,并假设您可以在此时安全地设置currentTime

似乎最安全的方法是在每次与视频相关的事件后检查seekable,如果它包含您想要寻找的时间,则在该点设置currentTime。在 iPad 上,seekable 可能要等到canplaythrough 事件之后才会被填充,这已经很晚了。

有关更多信息,请参阅my blog post。

【讨论】:

【参考方案4】:

我遇到了同样的问题 - 以下是我的情况:

UIWebView - iPad Simulator
duration=4.861666679382324
startTime=0
currentTime=4.861666679382324
buffered(1)=[0-0]
seekable(0)=
seeking=false
error=null
readystate=4
networkstate=3

Chrome:
duration=4.9226298332214355
startTime=0
currentTime=4.9226298332214355
buffered(1)=[0-4.9226298332214355]
seekable(1)=[0-4.9226298332214355]
seeking=false
error=null
readystate=4
networkstate=1

所以 - 没有任何东西被缓冲,也没有任何东西是可搜索的。我正在通过 UIWebView 从 iPad 包的资源目录播放本地剪辑。

在我的情况下,我只需要在每次播放后重置到视频的顶部,我可以通过调用“load()”来完成此操作

【讨论】:

以上是关于在 iPad 上搜索 HTML5 视频的主要内容,如果未能解决你的问题,请参考以下文章

iPad 上缺少 html5 视频“结束”事件

html5 视频无法在 iPad 上播放 - 在 iPhone 上播放

使用 HTML5 视频标签退出全屏

在 iPad 上调试 HTML5 视频的方法

在 iPad 上播放 HTML5 视频?

通过 Android WebView 在 YouTube HTML5 视频中搜索