11

AVPlayerを介してビデオ ファイルの再生を提供する必要があるアプリを開発中です。ファイルはユーザーのデバイスに保存する必要がありますが、ダウンロード中に再生する必要もあります。

現時点では、ASIHTTPRequestライブラリを使用して PHP 経由でビデオ ファイルを取得し (パブリック URL 経由でメディアをリンク可能にしたくありません)、それらを非同期的にディスクに書き込むダウンロード モジュールを作成しました。

次に、 AV Foundation Programming Guideに従って AVPlayer をセットアップし、AVURLAsset を使用してファイルを取得し、アセットを使用して AVPlayerItem を作成し、アイテムを使用して AVPlayer を構築し、プレーヤーを AVPlayerLayer に設定しました。プレーヤーは、完全にダウンロードされたビデオ ファイルで正常に動作し、プログレッシブにダウンロードされたファイルもシミュレーターで完全に正常に動作します。

残念ながら、実際のデバイスでは、プレーヤーの動作が変わります。代わりに、ビデオを 1 回ロードし、ディスクから新しいパケットを取得しようとしないように見えます。その結果、プレーヤーは、アセットがロードされた時点でダウンロードの進行状況を示すビデオのポイントまでビデオとオーディオを再生します(たとえば、2MB のデータがバッファリングされてからプレーヤーが作成される場合、プレーヤーは最大 2MB 分のデータを再生できます)。ビデオのヘッダーがあるため、プレーヤーはビデオの全期間にわたって再生されていると喜んで考え続けますが、他のビデオが画面にレンダリングされることはありません。

最後の問題は、ビデオが AVComposition に挿入され、それを使用して AVPlayer が作成された場合、プログレッシブ ビデオが正常に再生されることです。これは素晴らしい解決策です (また、場合によってはアプリに必要です) が、アプリのクライアントは、ビデオが AirPlay 経由で Apple TV で再生可能であることを要求しますが、AVCompositions はこれができません。

AVURLAssets から構築された AVPlayer を使用して、プログレッシブ ダウンロード ビデオ ファイルを再生する方法があるかどうかは誰にもわかりませんか? ビデオをメモリにキャッシュしているように見えるのではなく、AVURLAsset を使用して、AVComposition で行うように、player/playerItem を強制的にディスクから読み取る方法はありますか?

ありがとう!

4

1 に答える 1

6

AVURLAssetsで動作させるための解決策はありませんが、少し異なるアプローチを使用しています。アプリをCocoaHTTPServerにバンドルし、ローカルサーバーに対するHTTPリクエストを介して完全にダウンロードされていないビデオファイルを再生します。

サーバーはファイルの全長を認識しており、HTTPヘッダーを調べて、ファイルのどの部分が要求されているかを判断し、ディスクまたはリモートソースからロードします。

ここでこれを開発している間、常に3つの初期要求があります。1つはファイルの最初の2バイト、1つはファイルの先頭からの大きなチャンク、もう1つはファイルの末尾から直接です。そのため、プレーヤーは最初から必要になるため、少なくとも最後の部分をリモートサーバーから直接ロードする必要がありました。ローカルファイルでも同じことが起こると思います。そのため、プレーヤーはファイルの最後のバイト(正しい最後のバイトではありません)をロードし、その長さを超えて再生しません。

HTTPConnectionをサブクラス化し、提供されている「HTTPAsyncFileResponse」を調べて独自のHTTPResponseクラスを作成する必要があります。

これにより、別のアプローチでこれを実現する方法がわかると思います。

于 2013-02-13T12:46:30.490 に答える