4

基本的な HTML5 ビデオのセットアップがあり、そこから 4 つのビデオのうちの 1 つをロードします。私が抱えている問題は、次のビデオをロードすると、前の時間位置から再生が続くことです。プロパティを設定する努力は、currentTime短命であるか、完全に無視されているようです。

イベントのコレクションにリスナーを追加し、それぞれに次のようなものを用意しました。

myPlayer.addEventListener("loadeddata", function() {
        console.log(" loadeddata: before = " + myPlayer.currentTime);
        myPlayer.currentTime = 0.1;
        console.log(" loadeddata: after = " + myPlayer.currentTime);
    }, false);

1 つのイベントの時間の変更が表示されることがありますが、正しく保持されません。

durationchange: before = 19.773332595825195
durationchange: after = 0.10000000149011612

loadedmetadata: before = 0.10000000149011612
loadedmetadata: after = 19.773332595825195

loadeddata: before = 19.773332595825195
loadeddata: after = 0.10000000149011612

canplay: before = 0.10000000149011612
canplay: after = 19.773332595825195

また、まったく設定されていないように見えることもあります。

durationchange: before = 50.66666793823242
durationchange: after = 50.66666793823242

loadedmetadata: before = 50.66666793823242
loadedmetadata: after = 50.66666793823242

loadeddata: before = 50.66666793823242
loadeddata: after = 50.66666793823242

canplay: before = 50.66666793823242
canplay: after = 50.66666793823242

これはここの問題に似ているようですが、解決策はないようです。以前に iPhone でこの問題に遭遇した人はいますか?

4

8 に答える 8

12

私の調査結果から、問題は、iPhone のみ (iPad は正常に動作) で、「canplaythrough」イベントまで currentTime プロパティが正しく設定されないことですが、その時点で currentTime を変更すると、顕著な問題が発生するようです。その解決策は、ロードを呼び出した後にビデオを意図的に一時停止することです...

myVideo.load();
myVideo.pause();        

...そして、時間がリセットされたときにイベントで play を呼び出します。

ただし、2 つ目の問題は、新しいムービーの長さが currentTime の位置よりも短い場合です。この場合、currentTime の設定に失敗するだけでなく、「canplaythrough」が呼び出されることもなく、QT は何もせずにビデオの最後に留まります。

両方の問題の解決策は、「canplaythrough」の前にイベントで currentTime がリセットされなかった場合に、セカンダリ ロードを強制することであることがわかりました。タイマーのコールバックについては少し面倒ですが、うまくいくようです。

var myVideo = document.getElementById("video1"); 

myVideo.addEventListener("canplay", function() {
    console.log(" canplay: before = " + myVideo.currentTime);
    myVideo.currentTime = 0.1;
    console.log(" canplay: after = " + myVideo.currentTime);

    if( myVideo.currentTime < 1 ) {
        myVideo.play();
    }
    else {
        myVideo.load();
        myVideo.pause();
        setTimeout(checkStarted, 500);
    }
}, false);

function checkStarted()
{ 
    console.log(" checkStarted called");
    myVideo.play();
}
于 2013-08-16T22:44:43.480 に答える
1

ここでは最後の 2 つの回答を組み合わせて使用​​しましたが、iOS ではイベントが 2 を超えることはめったにないため、準備完了状態の制限を 2 ( HTMLVideoElement.prototype.HAVE_CURRENT_DATA)に減らす必要がありました。loadeddata

于 2018-09-06T22:40:45.130 に答える
-1

これは、ローカル アセットのクロムの問題です。私と一緒に起こりました。ローカルアセットからビデオを提供し、時間を設定すると、ビデオが0にリセットされます。そのため、私にとってうまくいった解決策は、s3バケットからビデオを提供することでした。

于 2021-01-05T13:57:49.097 に答える