AVAudioPlayerを使って音楽を再生するアプリを作りました。曲をアップロードまたはダウンロードし、Core Data に書き込み、選択時に呼び出して再生します。私がテストした 15 曲はすべて、iPhone ミュージック クライアントと自分のコンピュータの両方を使用して正常に動作しました。
ただし、そのうちの 3 つはアプリで再生されません。具体的には、これらの 15 曲を任意の順序でアップロードし、Model.sqlite を消去してアプリに再度ダウンロードすると、そのうちの 3 曲は再生されません。ただし、タイトルとアーティストは適切です。
これを調べてみると、動作しないファイルが .m4a であるという違いがあることに気付きました。AVAudioPlayer でその形式のファイルを再生するにはどうすればよいですか?
編集(「「リコール」とは何ですか?AVAudioPlayerを初期化するURLは何ですか?」):
ユーザーがアプリからアクセスできる曲を含むサーバーがあります。取得するサブセット S を選択した後、アプリは S をダウンロードし、NSManagedObjectContext を使用して CoreModel に書き込みます。各曲は、一意の ID とサブセット エンティティ (この場合は S) との関係を持つ個別のエンティティとして格納されます。
コンテキストを使用して適切な曲を取得するために AppDelegate を使用して「思い出す」と、データも返されます。次に、AVAudioPlayer を次のように初期化します。
[[AVAudioPlayer alloc] initWithData:(NSData *)[currentSong valueForKey:@"data"] error:nil];
...だから私はそれを書いて、実際にエラーが何であるかを実際にチェックしていないことに気付きました(ばかげた私)。OSStatus error 1954115647
サポートされていないファイルの種類として返される であることがわかりました。これをもう少し調べてみると、このiPhone: AVAudioPlayer unsupported file typeが見つかりました。解決策として、最初の不正なデータを削除するか、URL のコンテンツから初期化する方法が示されています。コアモデルでデータが書き込まれている場所を見つけて、それを URL としてフィードすることは可能ですか?
EDIT:(ファイルを比較してください。それらは異なりますか?)
はい、そうです。アプリによってアップロードされたサンプルの .m4a ファイルをサーバーから取得し、iTunes にあるファイルと比較しています。私が見つけたのは、ファイルがオフセット 229404 (2906191 バイトのうち) の前で切り取られていることです20680001 A0000E21
。iTunes バージョンで0028D83B 6D646174
は、これらのバイトの前にあります。その前には、iTunes エンコーディング情報が先行する大きなデータ ブロックが先行するゼロの大きなブロックがあります。最上部には、ファイルが M4A であることを示すエンコード情報が表示されます。