4

AS3 を C++ に変換し、そこから iOS にエクスポートする OpenPlug というサードパーティ ツールを使用して開発された iPad アプリがあります。(これは、私が作成した XCode で Obj-C を使用する「ネイティブ」アプリではないことに注意してください。私は AS3 を作成しました)

これで、写真とビデオをスライドショーで表示する iPad アプリケーションができました。ビデオについては、ビデオ オブジェクトの src プロパティを、アプリケーション ストレージにダウンロードされたビデオ ファイルの場所に変更する HTML ページをロードする WebView を使用しています。これは正常に機能していますが、数時間 (3 ~ 6) 実行するとアプリケーションがフリーズします。

この問題を検索し、HTML5 <video> のロード/アンロード時に iOS Safari のメモリ リークで解決策を試しましたが、何も変わらないようです。

アプリケーションが (HTML ページがビデオをロードする必要がある直前に) フリーズし、クラッシュしないため、これはどういう意味ですか? ビデオ オブジェクトを破棄する必要がありますか? 最初は各ビデオに新しい WebView を作成していましたが、今は WebView を再利用して src プロパティを変更していますが、それも役に立ちません。

誰でもこれに光を当てることができますか?OpenPlug はサービスを終了し、サポートを提供しなくなりましたが、iPad の Web ビュー/ビデオの問題だと思います (?)

重要な注意事項: アプリケーションはフリーズしていますが、私の 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>
4

1 に答える 1

0

コード全体を投稿していただけると助かりますが、UI の再描画も担当するメイン スレッドで Web からビデオを読み込んでいるため、フリーズしていると思います。スレッド内に大きなビデオをロードすると、UI もフリーズします。

ビデオの読み込みを行うコードを別のスレッドに移動することをお勧めします (iOS5 を使用している場合はブロックを使用してください)。

于 2012-08-01T09:56:50.517 に答える