2013-07-08 33 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端用“.m4a”代替“.aac”并尝试播放它。

问题1:有谁知道为什么更改文件扩展名会导致AVAudioPLayer失败?顺便说一句,我上面创建的“.m4a”文件无法用Mac上的任何文件打开,因此我无法确定问题是出在文件格式还是iOS或Mac无法读取此文件类型。

对于任何人都好奇,我把一个 “.AAC” 的副本,并从AVAudioRecorder一个名为 “.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一通道,结果文件是立体声。为什么? (至少这是VLC关于元数据的说法)

问题3:是否有指定AAC-LC用于无损编码?或者我只能这样做,如果我从AVAudioRecorder移动到较低级别的API?

+1

这是有帮助的:http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format –

+0

在这个问题上接受的答案是完全错误的。该文件不是实际的AAC文件。它只是裹在一个m4a。其他答案之一是正确的。这个答案也更有帮助: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的Get Info窗口中的音频文件显示为单通道。

问题3没有答案。

+0

mahboubz伟大的呼叫点1完全解决了我的问题! –

3

对于创建和录制音频的名为“.m4a”文件,该文件在播放的iOS以及Android中,我使用下面的代码:

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”文件,在android中只是将扩展名从“fileName.m4a”更改为“fileName.mp3”,并且它令人惊讶地工作。并且在iOS文件=“fileName.m4a”中播放流畅。

相关问题