iOS应用在载入网页视图中的视频时会卡顿,但不会崩溃。

4
我有一个iPad应用程序,使用第三方工具OpenPlug开发,将AS3转换为C ++ 并从那里导出到iOS。 (只是想指出,这不是由我编写的Obj-C在XCode中使用的“本机”应用程序,我编写了AS3)
现在我有这个iPad应用程序,可以在幻灯片中显示图片和视频。对于视频,我使用WebView加载HTML页面,在其中更改视频对象的src属性以指向下载到我的应用程序存储的视频文件位置。这很好地运行,但当它运行几个小时(3-6)时,应用程序会冻结。
我搜索了这个问题,并尝试了iOS Safari memory leak when loading/unloading HTML5 <video> 中的解决方案,但似乎没有改变任何东西。
由于应用程序在冻结之前需要加载视频的HTML页面,而且没有崩溃,那是什么意思? 我需要销毁视频对象吗?起初,我为每个视频创建新的WebView,但现在我正在重复使用webview并只更改src属性,但也无法帮助我。
有人能够阐明一下吗? OpenPlug已终止其服务并不再提供任何支持,但我认为这更像是iPad上的Webview / video问题(?)
需要注意的重要事项:应用程序冻结但我的iPad没有。该应用程序不生成崩溃报告,也不再执行任何代码(也没有跟踪)。当我按下iPad上的主页按钮并按下应用程序图标时,应用程序将重新启动。
这是我的HTML页面代码,每次需要启动新视频时都会刷新它(webview.location = ...)
<html>
    <head>
        <script>
            function videoEndedHandler(){
                var video = document.getElementById("videoPlayer");
                video.src = "";
                video.load();
                window.location.hash = "ended";
            }

            function videoErrorHandler(){
                window.location.hash = "error";
                var video = document.getElementById("videoPlayer");
                video.src = "";
                video.load();
            }

                                    var loop;
                                    function setup(){
                                        var video = document.getElementById("videoPlayer");
                                        video.addEventListener("error", videoErrorHandler,false);
                                        video.addEventListener("ended", videoEndedHandler,false);
                                        video.load();
                                        video.play();
                                        startHashLoop();
                                    }

                                    function startHashLoop(){
                                        if(window.location.hash == "#touched"){
                                            setAsPaused();
                                        }

                                        if(window.location.hash == "#paused"){
                                            //check image
                                            testImage("shouldResume.png?nocache=" + Math.random());
                                        }


                                        if(window.location.hash == "#resume"){
                                            var video = document.getElementById("videoPlayer");
                                            video.play();
                                        }

                                        loop = setTimeout(hashLoop,500);
                                    }

                                    function testImage(url) {
                                        var img = new Image;
                                        img.addEventListener("load",isGood);
                                        img.addEventListener("error",isBad);

                                        img.src = url;
                                    }

                                    function isGood() {
                                        window.location.hash = "resume";
                                    }

                                    function isBad() {
                                        //alert("Image does not exist");
                                    }


                                    function hashLoop(){
                                        startHashLoop();
                                    }

                                    function setAsTouched(){
                                        window.location.hash = "touched";
                                    }

                                    function setAsPaused(){
                                        var video = document.getElementById("videoPlayer");
                                        video.pause();
                                        window.location.hash = "paused";
                                    }
                                    </script>
    </head>

    <body onload="setup();" style="background-color:#000000;">
    <a href="javascript:setAsTouched()" style="top:0;left:0;position:absolute;z-index:1;color:#FF0000;border:0px solid red;width:100%;height:100%;display:block;"></a>
        <video id="videoPlayer" style="top:0;left:0;position:absolute;" width="100%" height="100%" preload="auto" src="##VIDEO_URL##" autoplay="autoplay" webkit-playsinline />

    </body>
</html>

1
总之,"我的应用程序卡住了"。请展示代码,否则没有人能够帮助你。 - borrrden
HTML页面的代码已添加。 - Fréderic Cox
我也想知道为什么应用程序会冻结而不是崩溃?你有什么想法吗? - Fréderic Cox
可以有人帮帮我吗?我有更多信息:尽管有足够的内存可用,但视频仍会冻结,因此这不是内存问题,但由于某种原因,在我的应用程序运行大约8到9个小时后,视频会冻结。这个视频以前已经播放过了,所以我不知道可能是什么原因,有人可以提供帮助吗? - Fréderic Cox
请展示你加载此网页的代码。 - Jeff Wolski
1个回答

0

如果您能发布整个代码将会很有帮助,但我认为它之所以冻结是因为您正在主线程中加载网络视频,而主线程还负责重新绘制UI。通过在线程内加载大型视频,您的UI也会冻结。

我建议将负责视频加载的代码移动到单独的线程中(如果您使用的是iOS5,则可以使用块)。


问题在于我正在使用OpenPlug,因此我无法显示任何相关的iOS代码,因为我正在使用中间代码,该代码使用C编译为iOS。 - Fréderic Cox

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