19

カスタム シーク バーを備えた HTML5 ビデオ プレーヤーがあります。これは、iPhone (インラインで再生) とブラウザーでうまく機能しています。

iPad でも問題なく再生され、ムービーの再生に合わせてシーク バーが更新されますが、何らかの理由でシークできません。

すべての値は正しく、設定しようとしています:

myPlayer.currentTime = XX;

残念ながら、iPad は .currentTime 属性の設定を拒否しています。

ブラウザーと iPadの違いをまとめると、ブラウザーでは次のようになります。

myPlayer.networkState = 3
myPlayer.readyState = 4

iPad では次のようになります。

myPlayer.networkState = 2
myPlayer.readyState = 3

これはまったく同じコードで、ローカルの MP4 ビデオを実行しています。

なぜこれが起こっているのですか?

乾杯、 アンドレ

4

4 に答える 4

6

JavaScript でオーディオ要素を制御するのにさまざまな問題があり、 currentTime プロパティに多くのフラストレーションがありました。また、ユーザーによるイベントの直接開始を構成する要素に対する Apple の制限もありました。

iPad での JavaScript と HTML5 のビデオ再生 (または文書化されていない「機能」) に、回避策が必要な奇妙なバグがあったとしても、私は驚かないでしょう。私の経験からすると、iPad には公式ドキュメントに記載されているよりも独自の方法があります。

video 要素のerrorbufferedseekable、およびseekプロパティを確認する必要があります。readyState と networkState の値を見ると、iPad はビデオが完全に読み込まれていないと考えているようです。これは、ローカル リソースとしては奇妙です。

bufferedおよびseekableは、動画全体の時間範囲と同じにする必要があります。seek は TRUE でなければなりません。これにより、少なくとも問題についてもう少し情報が得られるはずです。

他のビデオでテストしましたか?iPadに問題があるビデオには、何らかのエンコードの問題がある可能性があります。

それ以外 - 以前の iPad OS バージョンには、currentTime プロパティを設定する機能を壊すバグがありました。最新のOSバージョンを使用していますか?

于 2010-10-01T19:18:57.570 に答える
5

この問題は、video.currentTimeプロパティで使用される値に関連しています。私の特定のケースでは、シーク中に10進数1桁の浮動小数点数を使用していることを常に確認することで問題を修正しました。

iOS 3.2 で ZERO に設定video.currentTimeすると、実際にビデオが最初にシークされますが、その後値は更新されません。timeupdateイベントは正常にディスパッチされますが、読み取ろうとcurrentTimeすると常に同じ値が返されます。

動画の先頭をシークするには の0.1代わりにを使用0し、シークするには を12.2345使用します12.2

PS: を使用(+(12.2345).toFixed(1))して、10 進数の桁数を 1 に制限できます。

于 2011-03-29T03:48:34.577 に答える
2

カイルの答えは良いものです。追加しますが、特定のイベントの後に属性が入力されていると想定することはできませんseekableloadedmetadataこれは、 、canplay、またはその他のイベントを待つことができずcurrentTime、その時点で安全に設定できると想定できないことを意味します。

seekableビデオ関連のイベントごとに確認し、シークしたい時間が含まれている場合は、その時点で設定するのが最も安全な方法のようですcurrentTime。iPad ではseekable、イベント終了後まで埋まらない可能性がありcanplaythrough、かなり遅くなります。

詳細については、私のブログ投稿を参照してください。

于 2011-06-16T00:06:36.377 に答える
0

私は同じ問題を抱えています-私の場合のプロパティは次のとおりです。

UIWebView - iPad Simulator
duration=4.861666679382324
startTime=0
currentTime=4.861666679382324
buffered(1)=[0-0]
seekable(0)=
seeking=false
error=null
readystate=4
networkstate=3

Chrome:
duration=4.9226298332214355
startTime=0
currentTime=4.9226298332214355
buffered(1)=[0-4.9226298332214355]
seekable(1)=[0-4.9226298332214355]
seeking=false
error=null
readystate=4
networkstate=1

so - 何もバッファリングされておらず、シーク可能なものもありません。UIWebView を介して、iPad バンドルのリソース ディレクトリからローカル クリップを再生しています。

私の場合、必要なのは、再生するたびにビデオの先頭にリセットすることだけで、「load()」を呼び出すことでこれを達成できました。

于 2010-10-05T17:49:32.757 に答える