5

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 であることを示すエンコード情報が表示されます。

4

3 に答える 3

0

これは直接的な解決策ではありませんが、ブロブを Core Dataに直接保存するべきではありません。ファイルをキャッシュされた場所に書き込み、ファイル パスを Core Data に保存します。これにより、データベースがより効率的に使用され、AVAudioPlayer に与えるローカル ファイル パスが提供され、問題が回避されます。

于 2013-05-02T17:09:06.937 に答える
0

お使いのコーデックが iOS でサポートされていることを確認してください。AVAudioPlayer は、iOS がサポートする任意の形式を再生する必要があります。サポートされている形式のリストは、http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html# で参照できます。 //apple_ref/doc/uid/TP40009767-CH2-SW6 .

これらのファイルを iTunes を介してデバイスに手動で追加し、iPod で再生することをお勧めします。再生できない場合、問題はコードや SDK ではなく、フォーマットです。

于 2013-04-26T00:19:16.347 に答える