经过多次播放后,iOS UIWebView中的HTML5video上的MEDIA_ERR_DECODE

在iOS中的UIWebView中的HTML5video控件中播放大约20个短video片段(mp4)后,后续片段失败并显示MEDIA_ERR_DECODE 。 问题是,我知道video很好,因为它们之前曾播放过,有时甚至在同一会话期间播放。

此外,如果您等待足够长的时间来请求新的video片段,它通常会再次开始工作。

我也知道它不是服务器,因为我可以在我的台式计算机上对chrome执行完全相同的操作,它总是有效。

根据我的故障排除,似乎这个错误在iOS本身。

  1. 有没有人有任何解决这个问题的想法?
  2. 有没有办法在iOS中获取有关此类媒体解码错误的更多信息? 我尝试使用Safari的开发工具来收听http请求,但我不能让它记录的时间超过几秒钟才会出现内存不足错误并导致应用程序死亡。

更新:在iOS模拟器中运行时也可以正常工作。 似乎这个问题只发生在iPad本身

与Apple支持人员讨论后,问题已得到解决。 问题与硬件H264解码器有关。 基本上,我从不通过永远不释放video资源(我认为javascript会自己做)来从硬件解码器缓冲区中删除video。

所以我设置这样的源:

 $(vid).src = "some source file"; $(vid).play(); ... some other stuff happens ... $(vid).remove(); 

这样做从来没有从解码器缓冲区中删除video,这意味着最终它无法再解码任何video。

要解决此问题,您必须从DOM中删除video:

 $(vid).src = "some source file"; $(vid).play(); ... some other stuff happens ... $(vid).remove(); $(vid).src = ""; $(vid).load(); 

现在我意识到这没有多大意义,因为在调用.remove()之后,我会假设控件已经从DOM中删除了,任何垃圾收集都会自动完成剩下的工作。 但是,它并不像那样。 我希望这有助于其他人。

它不是iOS特定的。 我可以在Chrome网络浏览器中重现。

注意:如果video有多个源,则必须为每个源重置src属性。

 var sources = $(vid).getElementsByTagName('source'); for (var index = 0; index < sources.length; index++) { sources[index].src = ""; } $(vid).load(); 

上面的jugg1es答案是正确的,但如果您尝试使用HLSvideo,问题仍然存在。 当我尝试使用jquery-3.1.1.js的解决方案时,我在jquery的load()方法中遇到了错误。 不使用jquery实际上对我有用:

  document.getElementById(id).src = ""; document.getElementById(id).load(); 

谢谢jugg1es你保存了我的项目。

Interesting Posts