以下の質問については注意してください:すべてのアセットはデバイス上でローカルです-ネットワークストリーミングは行われていません。ビデオにはオーディオトラックが含まれています。
問題のビデオクリップを開始するために最小限の遅延でビデオファイルを再生する必要があるiOSアプリケーションに取り組んでいます。残念ながら、実際に起動する必要があるまで、次の特定のビデオクリップはわかりません。具体的には、1つのビデオクリップが再生されると、次の(おおまかに)10個のビデオクリップのセットが何であるかがわかりますが、次のクリップを「すぐに」再生する時が来るまで、正確にはわかりません。
実際の開始遅延を確認するために行ったのはaddBoundaryTimeObserverForTimes
、ビデオプレーヤーを呼び出し、1ミリ秒の時間間隔でビデオが実際に再生を開始した時刻を確認することです。そのタイムスタンプの差を最初の再生を開始するアセットを示すコード。
これまで見てきたことから、AVAsset
読み込みの組み合わせを使用し、AVPlayerItem
準備ができたらそこからを作成し、AVPlayerStatusReadyToPlay
playを呼び出す前に待機すると、開始に1〜3秒かかることがわかりました。クリップ。
呼び出し元:私は以来、私はほぼ同じだと思うものに切り替えた[AVPlayerItem playerItemWithURL:]
と待っているAVPlayerItemStatusReadyToPlay
プレーします。ほぼ同じパフォーマンス。
私が観察していることの1つは、最初のAVPlayerアイテムのロードが他のアイテムよりも遅いことです。1つのアイデアは、最初のビデオを再生しようとする前に、短い/空のアセットでAVPlayerを事前に飛行させることは、一般的な慣習になるかもしれないようです。[ AVAudioPlayerの最初のサウンド再生時のスロースタート
私はビデオの開始時間をできる限り短くし、実験するためのアイデアをいくつか持っていることを望みますが、役立つ可能性がある人からのガイダンスをお願いします。
更新:実装後のアイデア7では、スイッチング時間が約500 msになります。これは改善ですが、これをさらに速くした方がいいでしょう。
アイデア1:N個のAVプレーヤーを使用する(機能しない)
〜10個のAVPPlayer
オブジェクトを使用し、すべての〜10個のクリップを開始および一時停止します。本当に必要なものを確認したら、切り替えて正しいの一時停止を解除AVPlayer
し、次のサイクルのために最初からやり直します。
私はこれがうまくいくとは思いません。私が読んだのはAVPlayer's
、iOSでアクティブにできる制限はおよそ4 であるためです。ここでStackOverflowについてこれについて質問している人がいて、4 AVPlayerの制限について知りました:fast-switching-between-videos-using-avfoundation
アイデア2:AVQueuePlayerを使用する(機能しません)
10をにAVPlayerItems
押し込むと、AVQueuePlayer
シームレスに開始するためにそれらすべてがプリロードされるとは思いません。 AVQueuePlayer
はキューであり、キュー内の次のビデオをすぐに再生できるようにするだけだと思います。10本の動画のうちどれを再生したいかは、その動画を開始する時までわかりません。ios-avplayer-video-preloading
アイデア3:ロード、再生、AVPlayerItems
バックグラウンドでの保持(まだ100%確実ではありませんが、見栄えはよくありません)
各ビデオクリップの最初の1秒をバックグラウンドでロードして再生し(ビデオとオーディオの出力を抑制)、それぞれへの参照を保持し、AVPlayerItem
再生する必要があるアイテムがわかっている場合にメリットがあるかどうかを確認しています実際にそれを入れ替え、バックグラウンドのAVPlayerをアクティブなAVPlayerと入れ替えます。すすぎと繰り返し。
理論的には、最近再生AVPlayer/AVPlayerItem
されたは、その後の再生を高速化する準備されたリソースをまだ保持している可能性があります。これまでのところ、これによるメリットはありませんがAVPlayerLayer
、背景の設定が正しくない可能性があります。これが私が見たものから本当に良くなるとは思えません。
アイデア4:別のファイル形式を使用する-おそらく読み込みが高速な形式ですか
現在、.m4v(video-MPEG4)H.264形式を使用しています。H.264には多くの異なるコーデックオプションがあるため、一部のオプションは他のオプションよりも高速にシークできます。ファイルサイズを小さくする高度な設定を使用すると、シーク時間が長くなることがわかりましたが、逆のオプションは見つかりませんでした。
アイデア5:ロスレスビデオ形式+ AVQueuePlayerの組み合わせ
読み込みが高速でファイルサイズが異常なビデオ形式がある場合、1つのアイデアは、各ビデオクリップの最初の10秒を、膨らんでいるが読み込みは高速であるが、戻ってくるバージョンで事前準備することです。 H.264でエンコードされたアセットを使用します。AVQueuePlayerを使用し、最初の10秒を非圧縮ファイル形式で追加します。その後に、準備/プリロード時間が最大10秒になるH.264の形式を追加します。だから私は両方の世界の「最高」を手に入れます:速い開始時間だけでなく、よりコンパクトなフォーマットからも恩恵を受けます。
アイデア6:非標準のAVPlayerを使用する/自分で作成する/他の人を使用する
私のニーズを考えると、AVPlayerを使用できない可能性がありますが、AVAssetReaderを使用して、最初の数秒をデコードし(未加工ファイルをディスクに書き込む可能性があります)、再生に関しては、未加工形式を使用して再生する必要があります速く戻る。私には巨大なプロジェクトのように思われますが、私が単純な方法でそれをやってみると、それは不明確です/うまく機能することすらありません。デコードおよび非圧縮の各ビデオフレームは2.25 MBです。単純に言えば、ビデオの最大30 fpsを使用すると、最大60 MB / sのディスクからの読み取り要件が発生します。これはおそらく不可能です/プッシュすることです。明らかに、ある程度の画像圧縮(おそらく、PVRTCを介したネイティブのopenGL / es圧縮形式)を行う必要がありますが、それはちょっとおかしいです。多分そこに私が使用できるライブラリがありますか?
アイデア7:すべてを1つの映画アセットに結合し、seekToTime
上記のいくつかよりも簡単なアイデアの1つは、すべてを1つのムービーに結合し、seekToTimeを使用することです。問題は、あちこち飛び回っているということです。本質的に映画へのランダムアクセス。これは実際にはうまくいくと思います:avplayer-movie-playing-lag-in-ios5
どのアプローチが最善だと思いますか?これまでのところ、私はラグを減らすという点でそれほど進歩していません。