2013-07-08 17 views
9

他のiOSデバイスにオーディオファイル(安全/暗号化)を送信できるiOSアプリケーションを変更しようとしています。 AVAudioRecorderを使用してオーディオファイルを記録し、AVAudioPlayerを使用して受信したオーディオファイルを再生します。AVAudioRecorderは、開くことができる.m4aファイルを作成しません。

私は現在、Androidと互換性のあるファイルを作成して送信するようにアプリケーションを修正しようとしています。私はこれまで、既存のAVAudioRecorderコードを変更:

[settings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
[settings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey]; 
[settings setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitRateKey]; 
[settings setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; 
[settings setValue:[NSNumber numberWithFloat:48000.0] forKey:AVSampleRateKey]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *dirPath = [paths objectAtIndex:0]; 

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"yyyy-MM-dd HH-mm"]; 

NSString *filename = [NSString stringWithFormat:@"%@.aac", [format stringFromDate:NSDate.date]]; 

これによって作成されたファイルは、Mac上で、iOSデバイス上ではなく、Androidデバイス上で再生できます。ファイル拡張子を ".m4a"で終わるよう手動で変更した場合、ファイルはAndroid上で再生されます。

(「.aac」形式の利点は、アプリの古いバージョンでは、これらのファイルを受信し、それらを再生することができますということです - 私は後方互換性を維持してきました。)

は、だから私はこの変更を行った。

NSString *filename = [NSString stringWithFormat:@"%@.m4a", [format stringFromDate:NSDate.date]]; 

ただし、結果ファイル(AVAudioRecorderからエラーなしで作成されたファイル)は、MacでもiOSデバイスでも再生できません。 Android上で動作するかどうか聞くのを待っています。

AVAudioPlayerは、そのファイルを開こうとすると、それは出力:

エラードメイン= NSOSStatusErrorDomainコード= 1685348671 "操作 が完了できませんでした(OSStatusエラー1685348671.)" コード1685348671 - > "dta?":ファイルの形式が正しくありません。タイプのオーディオファイルの有効なインスタンスではなく、オーディオファイルとして認識されません。

「.aac」を持つようにファイルの名前を変更しても、MacまたはiOSのいずれにもロードできないという事実は変わりません。

今、「.aac」ファイルを作成し、Androidエンドで「.aac」を「.m4a」に置き換えて再生するのが最善のソリューションだと思われます。

質問1:ファイル拡張子を変更するとAVAudioPLayerが失敗する原因が分かるのですか?ところで、私が上記で作成した ".m4a"ファイルは、Mac上にあるものでは開けませんので、問題がファイル形式であるのか、iOSやMacでこのファイル形式を読むことができないのか分からない。好奇心旺盛な人のため

は、私はここで、AVAudioRecorderから ".aac" と ".M4A" ファイルのコピーを置く:

https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2013-24.m4a https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2010-11.aac

は質問2:私は1つにAVAudioRecorderを設定している間結果のファイルはステレオです。どうして? (少なくとも、VLCがメタデータについて語っていることです)

質問3:可逆符号化にAAC-LCを指定する方法はありますか?または、私がAVAudioRecorderからより低いレベルのAPIに移行する場合にのみ行うことができますか?

+1

これは役に立ちます:http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format –

+0

その質問に関する受け入れられた答えは完全に間違っています。このファイルは実際のAACファイルではありません。それはちょうどm4aで包まれています。他の答えの1つが正しいです。また、より多くの助けがこの答えだった:http://stackoverflow.com/a/12698691/86020 – mahboudz

答えて

8

質問1の答えは、オーディオセッションを正しく設定する必要があることです。そうでなければ、m4aファイルは正しくフォーマットされません。私は今、私は記録を開始する直前に、設定したオーディオセッションコードは次のとおりです。

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryRecord error:nil]; 
[session setActive:YES error:nil]; 

オーディオファイルを再生できるように記録が終了した後、私は再生のために戻ってセッションを設定します。

質問2は、不適切なチャネル数を表示していたVLCの問題です。 MacOS Finderの「情報を見る」ウィンドウのオーディオファイルは、単一のチャンネルとして表示されます。

質問3は未回答です。

+0

mahboubzポイント1の素晴らしい呼び出しが私の問題を完全に解決! –

3

のために、私は次のコードを使用して、iOSの中だけでなく、アンドロイドで遊ぶ「.M4A」ファイルにオーディオを作成し、レコード:アンドロイド側で

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; 

[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; 


AudioRecorder = [[AVAudioRecorder alloc] initWithURL:fileOutPutUrl settings:recordSetting error:nil]; 
[AudioRecorder setDelegate:self]; 
[AudioRecorder recordForDuration:RecordLimitTime]; // Record Limit if require 
if ([AudioRecorder prepareToRecord]) { 
    [AudioRecorder record]; 
} 

を、私は変更する必要はありませんAndroidのみの ".mp3"ファイルを再生するコードは、 "fileName.m4a"から "fileName.mp3"に拡張子を変更するだけで、驚くほど効果的です。また、iOSファイル= "fileName.m4a"はスムーズに再生されます。

関連する問題