我正在尝试修改可以将音频文件(安全/加密)发送到其他 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 尝试打开该文件时,它会输出:
错误域 = NSOSStatusErrorDomain 代码 = 1685348671“操作无法完成。(OSStatus 错误 1685348671。)”代码 1685348671 ->“dta?”:文件格式错误,不是其类型的音频文件的有效实例,或不被识别为音频文件。
仅仅将文件重命名为“.aac”并不能改变它无法加载到 Mac 或 iOS 上的任何内容的事实。
目前,似乎最好的解决方案是创建一个“.aac”文件,然后让 Android 端将“.aac”替换为“.m4a”并尝试播放。
问题一:有谁知道为什么更改文件扩展名会导致 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 设置为一个通道时,生成的文件是立体声的。为什么?(至少这就是 VLC 关于元数据的说法)
问题3:有没有指定AAC-LC进行无损编码?还是只有从 AVAudioRecorder 转移到较低级别的 API 时才能这样做?