5

現在、再生可能なすべての動画が埋め込まれたアプリが付属しています。これはうまくスケーリングできず、すべてのムービーを再生したい場合を除いて、ディスクスペースを浪費します。また、すべての映画を再ダウンロードする必要があるため、アプリをアップグレードすることはあまり望ましくありません。

私がやりたいのは、その場で映画をダウンロードし、ダウンロードしながら再生し、ダウンロードに成功したら、ファイルシステムに保存して、次に視聴したいときにローカルファイルからストリーミングできるようにすることです。

ビデオに必要なことは何でもできますが、現在、Amazon S3から.mp4ファイルとして提供しており、mimetypeはvideo / mp4であるため、問題の前半は正常に機能します。映画のダウンロード、 MPMovieViewControllerは、「十分」にダウンロードされたと判断するとすぐに再生を開始します。

そのビデオファイルのキャッシュを利用して、それを保存し、ファイルシステムに存在する期間を制御できるようにする方法はありますか?これが最も簡単なアプローチのようです。

私はiOS5+ 6をターゲットにしていますが、利用可能な唯一のソリューションがiOS 6を必要とする場合は、それも検討します。ありがとう!

更新: AFNetworkingを使用して、私は今、途中にいると思います。サーバーからビデオファイルをダウンロードして、ダウンロードの進行状況をリッスンしています。ビデオの25%がダウンロードされたことを確認したら、MPMoviePlayerControllerを使用してローカルファイルの再生を開始します。

私が今直面している主な問題は、再生が台無しになっているようだということです。順調に進んでおり、25%がダウンロードされ、再生が開始されます...ダウンロードは正常に続行されます...その後、ファイルのダウンロードが完全に終了し、その後すぐにビデオがフリーズします。画面上の再生タイマーはまだ再生が進行中であることを示しており、「再生終了」タイプの通知は表示されませんが、ビデオはフリーズしています。動作に基づく私の推測では、おそらくビデオ再生用の初期バッファーが使い果たされており、現在ディスク上でより多くのビデオが利用可能であることを検出していませんか?

MPMoviePlayerControllerと対話して、再生中のバッファーを更新するように定期的に通知する方法はありますか?または、この状況を処理する他の方法はありますか?

4

2 に答える 2

8

更新:@TomHammingからの新しい回答を確認してください。

私はまだ決定的な答えを見つけていませんが、現時点では答えは次のとおりだと思います。これを確実に行うことはできません。少なくとも、ハックのように思える多くの作業がなければなりません。MPMoviePlayerControllerを調整することでこれが可能になるはずなので、Appleに機能リクエストを提出しました。

私が試したり考えたりしたさまざまなことと、私が遭遇した結果について説明します。

  • MPMoviePlayerControllerにムービーファイルへのURLを渡します。これにより、ムービーファイルがストリーミングされ、保存されたキャッシュからローカルのDocumentsフォルダーにファイルがプルされます。iOS 6の時点では機能しません。私はAppleに機能リクエストを提出しましたが、現状では、ダウンロードしているファイル、AFAIKを手に入れる方法はありません。

  • NSURLConnection(またはAFNetworkなど)を使用してムービーファイルのダウンロードを開始し、「適切な量」がデバイスにダウンロードされたら、ファイルのURLをMPMoviePlayerControllerに渡して、ディスクからストリーミングします。ある種の作品ですが、うまくいきません。3つの問題:

    • ファイルの再生をいつ開始するかを知るのは非常に困難です。私はAppleが使用しているアルゴリズムを理解していないので、プレイする前に25%がダウンロードされるのを待って、常に注意を怠っていました。

    • MPMoviePlayerControllerインターフェイスは、Appleがネットワーク経由で計算を行っている場合のように、ストリーミングされている映画の感覚を提供しません。実際にはダウンロードされていないのに、ファイルは完全にダウンロードされているように見えます。

    • そして最も重要なことは、MPMoviePlayerControllerは、完全にダウンロードされていないファイルの再生ではうまく機能しないようです。ファイルのダウンロードが終了した後、またはプレーヤーがダウンロードされた量に追いついた場合に再生の問題が発生しましたが、これらの状況を適切に処理する方法が見つかりませんでした。

  • 上記と同じ手順ですが、AVFoundationクラスを使用して、再生プロセスをより細かく制御し、再生の停止などに関する上記の問題を回避します。動作する可能性がありますが、MPMoviePlayerControllerのすべての機能が必要です。この1つの機能を取得するためだけに、MPMoviePlayerControllerを自分で再実装することは、時間の無駄のように思えます。

  • 上記の#1と同じ手順ですが、アプリで小さなウェブサーバーを実行して、ディスクからMPMoviePlayerControllerへの動画のストリーミングを処理します。外部のウェブから直接ファイルをストリーミングする場合と同じようにストリーミングが機能することを期待しています。サーバ。動作しますが、結果はまだ散発的であり、パフォーマンスが低下しているように見えました。私はCocoaHTTPでテストを行いました。ひどいハックのように感じたので、私はこのアプローチに反対することにしました。

  • 軽量のHTTPプロキシを実行して、ダウンロードしたムービーファイルデータがインターネットからMPMoviePlayerControllerにストリーミングされるときにインターセプトします。これが機能するかどうかわからない。Objective-Cで記述された軽量のHTTPプロキシが見つからなかったため、これをまだテストできませんでした。現時点では、この実験を試すためだけに実装する気はありません。プロキシを作成する必要がない場合は、これらすべてのハックの中で次に簡単に実装できるようです。

この時点で、より良い解決策が見つかるまで、ファイルを完全にダウンロードしてからMPMoviePlayerControllerに渡すという、ハッキーではないがユーザーフレンドリーではないルートを選択することにしました。

于 2012-09-29T02:45:21.573 に答える
2

これは、iOS10以降で。を使用して実行できますAVAssetDownloadTaskこのWWDC2016セッションこのドキュメントを参照してください。

または、ムービーがDRMされていない場合は、AVAssetResourceLoaderDelegateAVPlayerを使用して行うことができます。これにより、任意のバイトストリームを効果的に指定できます。このウォークスルーを参照してください。

于 2018-04-04T17:00:49.760 に答える