MEDIA_ERR_DECODE 在 iOS UIWebView 中的 HTML5 视频播放多次后
MEDIA_ERR_DECODE on HTML5 video in iOS UIWebView after many plays
在 iOS 的 UIWebView 的 HTML5 视频控件中播放了大约 20 个短视频剪辑 (mp4) 后,后续剪辑失败并显示 MEDIA_ERR_DECODE
。问题是,我 知道 这些视频很好,因为它们以前播放过,有时甚至是在同一会话期间播放过。
此外,如果您等待足够长的时间来请求新的视频剪辑,它通常会重新开始工作。
我也知道它不是服务器,因为我可以在我的台式计算机上对 chrome 执行完全相同的操作,而且它始终有效。
根据我的故障排除,错误似乎出在 iOS 本身。
- 有人有解决此问题的想法吗?
- 是否有任何方法可以获取有关 iOS 中此类媒体解码错误的更多信息?我尝试使用 Safari 的开发工具来侦听 http 请求,但在它遇到内存不足错误并终止应用程序之前,我不能让它记录超过几秒钟。
更新:在 iOS 模拟器中 运行 时也能正常工作。看来问题只发生在 iPad 本身
经过与 Apple 支持人员的讨论,问题已得到解决。问题与硬件 H264 解码器有关。基本上,我从来没有通过从不释放视频资源来从硬件解码器缓冲区中删除视频(我认为 javascript 会自己做)。
所以我是这样设置源的:
$(vid).src = "some source file";
$(vid).play();
... some other stuff happens ...
$(vid).remove();
这样做永远不会从解码器缓冲区中删除视频,这意味着它最终无法解码更多视频。
要解决此问题,您必须按照以下方式从 DOM 中删除视频:
$(vid).src = "some source file";
$(vid).play();
... some other stuff happens ...
$(vid).remove();
$(vid).src = "";
$(vid).load();
现在我意识到这没有多大意义,因为在调用 .remove()
之后,我会假设控件已从 DOM 中删除并且任何垃圾收集都会自动完成剩下的工作。但是,它不是那样工作的。我希望这对其他人有帮助。
它不是 iOS 具体的。我可以在 Chrome 网络浏览器中重现。
注意:如果视频有多个来源,您必须为每个来源重置 src 属性。
var sources = $(vid).getElementsByTagName('source');
for (var index = 0; index < sources.length; index++)
{
sources[index].src = "";
}
$(vid).load();
jugg1es 上面的回答是正确的,但如果您尝试使用 HLS 视频,问题仍然存在。当我尝试将他的解决方案与 jquery-3.1.1.js 一起使用时,我在 jquery 的 load() 方法中遇到了错误。不使用 jquery 实际上对我有用:
document.getElementById(id).src = "";
document.getElementById(id).load();
谢谢 jugg1es 你救了我的项目。
在 iOS 的 UIWebView 的 HTML5 视频控件中播放了大约 20 个短视频剪辑 (mp4) 后,后续剪辑失败并显示 MEDIA_ERR_DECODE
。问题是,我 知道 这些视频很好,因为它们以前播放过,有时甚至是在同一会话期间播放过。
此外,如果您等待足够长的时间来请求新的视频剪辑,它通常会重新开始工作。
我也知道它不是服务器,因为我可以在我的台式计算机上对 chrome 执行完全相同的操作,而且它始终有效。
根据我的故障排除,错误似乎出在 iOS 本身。
- 有人有解决此问题的想法吗?
- 是否有任何方法可以获取有关 iOS 中此类媒体解码错误的更多信息?我尝试使用 Safari 的开发工具来侦听 http 请求,但在它遇到内存不足错误并终止应用程序之前,我不能让它记录超过几秒钟。
更新:在 iOS 模拟器中 运行 时也能正常工作。看来问题只发生在 iPad 本身
经过与 Apple 支持人员的讨论,问题已得到解决。问题与硬件 H264 解码器有关。基本上,我从来没有通过从不释放视频资源来从硬件解码器缓冲区中删除视频(我认为 javascript 会自己做)。
所以我是这样设置源的:
$(vid).src = "some source file";
$(vid).play();
... some other stuff happens ...
$(vid).remove();
这样做永远不会从解码器缓冲区中删除视频,这意味着它最终无法解码更多视频。
要解决此问题,您必须按照以下方式从 DOM 中删除视频:
$(vid).src = "some source file";
$(vid).play();
... some other stuff happens ...
$(vid).remove();
$(vid).src = "";
$(vid).load();
现在我意识到这没有多大意义,因为在调用 .remove()
之后,我会假设控件已从 DOM 中删除并且任何垃圾收集都会自动完成剩下的工作。但是,它不是那样工作的。我希望这对其他人有帮助。
它不是 iOS 具体的。我可以在 Chrome 网络浏览器中重现。
注意:如果视频有多个来源,您必须为每个来源重置 src 属性。
var sources = $(vid).getElementsByTagName('source');
for (var index = 0; index < sources.length; index++)
{
sources[index].src = "";
}
$(vid).load();
jugg1es 上面的回答是正确的,但如果您尝试使用 HLS 视频,问题仍然存在。当我尝试将他的解决方案与 jquery-3.1.1.js 一起使用时,我在 jquery 的 load() 方法中遇到了错误。不使用 jquery 实际上对我有用:
document.getElementById(id).src = "";
document.getElementById(id).load();
谢谢 jugg1es 你救了我的项目。