1

私は現在、ユーザーがサウンドクラウドから音楽をストリーミングできるようにする iOS アプリを作成しています。現在、ブースの最前線とバックグラウンドのアプリの状態で、Soundcloud から問題なくストリーミングできます。MP3 ファイルをダウンロードして再生しようとすると問題が発生し、アプリがバックグラウンドで、より具体的にはロックされた画面または画面がオフのときに継続的に再生されます。

ダウンロードしたファイルを再生して画面をロックすると、音声がしばらく再生され続けます。通常、再生時間は 2 ~ 3 分です。その後、再生が停止し、ユーザーがアプリに戻るまで、プレイリスト内の他のダウンロードされた mp3 ファイルは再生されません。ダウンロードされていないプレイリストのアイテムは、ユーザーがインターネットに接続していれば、ダウンロードしたアイテムが以前に再生に失敗したかどうかに関係なく、完全に再生されます。

次のエラーが表示されることがあります。

AVPlayerItemStatusFailed: エラー Domain=AVFoundationErrorDomain Code=-11800 「操作を完了できませんでした」 UserInfo=0x170270500 {NSUnderlyingError=0x170059380 「操作を完了できませんでした。操作は許可されていません」、NSLocalizedFailureReason=不明なエラーが発生しました (1)、NSLocalizedDescription=操作を完了できませんでした}

さらに、AVPlayerItem から次の通知を受け取ります。

通知: NSConcreteNotification 0x1700538c0 {name = AVPlayerItemDidPlayToEndTimeNotification; オブジェクト = AVPlayerItem: 0x178009300、アセット = AVURLAsset: 0x17822aaa0、URL = ファイル:///var/mobile/Applications/51118E74-3334-4EFC-B148-B485DE675F9E/Documents/Downloads/SC_165903784.mp3}

この通知は、再生中の最初のアイテムの再生が停止したときに受信されます。再生が最後まで終わらないときにこの通知を受け取るのは意味がありません。

私の推測では、アプリがバックグラウンド モードであるため、ファイルの読み取りに設定された時間は限られていますが、どういうわけかそれを疑っています。

以下を使用して、ローカル ファイルから AVPlayerItem を作成しています。

NSURL* url = [NSURL fileURLWithPath:song.downloadFilePath]; [AVPlayerItem playerItemWithURL:url];

独自の AVQueuePlayer を構築し、iOS Hysteria Player も使用してみましたが、両方のインスタンスでオフライン ダウンロード再生で同じバグが発生しました。

洞察や解決策は大歓迎です。

ありがとう!

4

2 に答える 2

1

Documents ディレクトリからファイルを再生していますか? (または、App Bundle 以外の場所でしょうか?)

その場合は、必ず を使用してファイルをディレクトリに保存して [fileToSave writeToFile:filePath options:NSDataWritingFileProtectionNone error:nil];ください。

これNSDataWritingFileProtectionNoneが重要なビットです。少なくとも私の場合、何が起こっているかというと、iOS は安全を確保しようとしているので、Documents ディレクトリ (およびその他の非アプリ バンドル ディレクトリ) に追加するファイルに対して、デフォルトでファイル保護を有効にしています。 、 私は信じている)。を追加することNSDataWritingFileProtectionNoneで、ファイルに対してこの保護を有効にしないようにシステムに要求しています。

Apple の iOS ドキュメントから:

ファイルを保護する場合、アプリはそのファイルへのアクセスを失うことに備える必要があります。完全なファイル保護が有効になっている場合、ユーザーがデバイスをロックすると、アプリはファイルの内容を読み書きできなくなります。

今、それを読んですぐに、デバイスがロックされるとアプリが再生を継続できなくなったのはこれが原因であるとほぼ確信しました. セキュリティ上の理由から、iOS はデフォルトでファイルを自動的に保護するようになっているようですが、これにより、デバイスがロックされている間、アプリを含むすべてのものがアクセスできなくなります。私のバグは、デバイスがロックされるとすぐに曲の一部しか再生されなかったことです。これは理にかなっています...実際の曲ファイルへのアクセスが取り消されたため、既にロックされている曲の一部しか再生できませんでした。 RAMにバッファリング!

これは、解決しようと頭を悩ませてきた 1 か月にわたる問題の修正でした。問題が解決することを心から願っています。

于 2014-11-08T06:57:06.807 に答える
0

この問題は、AVQueuePlayer の制限と、AVQueuePlayer をコア プレーヤーとして使用する HysteriaPlayer が原因であると考えられます。

AVQueuePlayer ドキュメントで、ローカル オーディオとリモート オーディオが混在するキューを処理できないことが言及されているのを見たことがあります (残念ながら見つかりません)。

いくつかの回避策があります:

AVPlayer を使用する

AVQueuePlayer を使用せず、自分でキューを処理し、AVPlayer にフィードします。

2 つの AVQueuePlayer を分離する

1 つはローカル メディア用、もう 1 つはリモート メディア用です。PlayerItem と Player を適切に挿入して使用します。

1 か月後にこの要件を満たすために HysteriaPlayer にパッチを適用します。その時点で戻ってくることができます。

于 2014-10-11T12:18:55.903 に答える