web-dev-qa-db-ja.com

iPhone:AVAudioPlayerでサポートされていないファイルタイプ

私のアプリはサーバーからmp3をダウンロードし、ユーザーに再生します。ファイルは64kbpsです(私が正しく理解していれば、これはiPhoneの許容範囲内です)。私は何十ものサイトでこれを行う方法を調べました、そしてそれらはすべて私がこれを正確に行うことを示唆しています:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://.../file.mp3"]];
NSError *e = nil;
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:data error&e];
[player setDelegate:self];

コードを実行すると、プレーヤーがnullに戻り、次のエラーが発生します。

2011-02-04 10:44:46.176 MyApp[6052:207] Error loading audio: Error Domain=NSOSStatusErrorDomain Code=1954115647 "The operation couldn’t be completed. (OSStatus error 1954115647.)"
2011-02-04 10:44:49.647 MyApp[6052:207] unsupported file type

ファイルを確認しましたが、機能することがわかりました。 Windows Media Playerでは問題なく再生され、MacではQuicktimeで再生されます。また、ファイルをiPhoneエミュレーターにアップロードしましたが、問題なく再生されます。ファイルは問題ありませんが、何らかの理由でAVAudioPlayerはそれを好みません。

変更する必要があるものはありますか? NSDataにファイルの種類を指定するための設定はありますか?誰か考えがありますか?

27
mtmurdock

ついに私はこの問題の解決策を見つけました! NSDataオブジェクトを使用してオーディオプレーヤーを初期化する代わりに、ファイルをDocumentsフォルダーに保存してから、ファイルURLを使用してプレーヤーを初期化しました。

//download file and play from disk
NSData *audioData = [NSData dataWithContentsOfURL:someURL];
NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/%@.mp3", docDirPath , fileName];
[audioData writeToFile:filePath atomically:YES];

NSError *error;
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
if (player == nil) {
    NSLog(@"AudioPlayer did not load properly: %@", [error description]);
} else {
    [player play];
}

アプリでファイルの処理が完了したら、削除できます。彼が私以上の助けになることを願っています!

31
mtmurdock

同じ問題を扱っていました。最初にファイルをディスクに書き込む必要がありました。最終的に私が見つけたのは、ダウンロードしていたデータの最初に余分な空白バイトがあったことです。 initWithContentsOfURLを使用してディスクから読み取る場合、AVAudioPlayerはこれを処理する方法を知っていましたが、initWithDataを使用してNSDataからロードする場合、そうではありませんでした。それらのバイトをトリミングすると修正されました。

12
Don

IOS7からAVAudioPlayerに新しいイニシャライザーがあります

NSError *error;
[[AVAudioPlayer alloc] initWithData:soundData fileTypeHint:AVFileTypeMPEGLayer3 error:&error]

サポートされているUTI

NSString *const AVFileType3GPP;
NSString *const AVFileType3GPP2;
NSString *const AVFileTypeAIFC;
NSString *const AVFileTypeAIFF;
NSString *const AVFileTypeAMR;
NSString *const AVFileTypeAC3;
NSString *const AVFileTypeMPEGLayer3;
NSString *const AVFileTypeSunAU;
NSString *const AVFileTypeCoreAudioFormat;
NSString *const AVFileTypeAppleM4V;
NSString *const AVFileTypeMPEG4;
NSString *const AVFileTypeAppleM4A;
NSString *const AVFileTypeQuickTimeMovie;
NSString *const AVFileTypeWAVE;
11
Yankouski Roman

製品名にスペースが含まれている場合は、エラーが発生します。
私のプロジェクトの製品名はPanorama1453TRでした。 initWithContentsOfURLメソッドはファイルパスをフェッチできません。だからそれは機能していませんでした。ブレークポイントをNSURL *fileURL =に置くことができます。ステップの後、fileURLにデータが何であるかを確認できます。
Panorama1453TRに変更しましたが、機能しました。

1
kordiseps