10

オーディオ ファイルを (安全に/暗号化して) 他の iOS デバイスに送信できる iOS アプリを変更しようとしています。AVAudioRecorder を使用してオーディオ ファイルを記録し、AVAudioPlayer を使用して受信したオーディオ ファイルを再生します。

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 がそのファイルを開こうとすると、次のように出力されます。

エラー Domain=NSOSStatusErrorDomain Code=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: AVAudioRecorder を 1 つのチャネルに設定すると、結果のファイルはステレオになります。なんで?(少なくとも、メタデータについてVLCが言っていることです)

質問 3: ロスレス エンコーディング用に AAC-LC を指定する方法はありますか? それとも、AVAudioRecorder から下位レベルの API に移行する場合にのみ行うことができますか?

4

3 に答える 3

9

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

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

オーディオファイルを再生できるように、録音が終了したらセッションを再生用に戻します。

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

質問 3 は未回答です。

于 2013-07-09T11:55:32.090 に答える