在 iPhone 应用程序中以 mp3 格式录制音频

Posted

技术标签:

【中文标题】在 iPhone 应用程序中以 mp3 格式录制音频【英文标题】:Recording audio in mp3 format in an iPhone app 【发布时间】:2012-05-11 09:43:55 【问题描述】:

我正在开发一个以 .wav 格式录制音频的 iPhone 应用程序。

代码如下:

NSMutableDictionary* recordSetting = [[NSMutableDictionary alloc]init];         
[recordSetting setValue :[NSNumber  numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:11025.0] forKey:AVSampleRateKey];         
[recordSetting setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];
[recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];




NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
 NSUserDomainMask, YES);

  NSString *documentsDirectory = [path objectAtIndex:0]; 

  NSString *myDBnew = [documentsDirectory stringByAppendingPathComponent:@"test.wav"];

 recordedTmpFile = [NSURL fileURLWithPath:myDBnew];

NSLog(@"Using File called: %@",recordedTmpFile);

        recorder = [[ AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:recordSetting error:&error];
        [recorder setDelegate:self];
        [recorder prepareToRecord];
        [recorder record];

以上代码是以 .wav 格式录制音频。如果我想使用键 kAudioFormatMPEGLayer3(mp3) 而不是 kAudioFormatLinearPCM(.wav) 在 MP3 中录制音频,我还需要进行哪些其他更改?采样率、通道等记录设置字典的变化。

或者建议任何兼容 iPhone 和 android 的音频格式,体积更小,可以直接从 iPhone 应用程序录制。

【问题讨论】:

【参考方案1】:

您不能在 MP3 中录制,它是一种专有格式,当涉及到编码时。这些是我使用的设置,2 分钟的录制时间约为 150KB:

NSString *tempDir = NSTemporaryDirectory();
NSString *soundFilePath = [tempDir stringByAppendingPathComponent:@"sound.m4a"];

NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,
                                  [NSNumber numberWithInt:AVAudioQualityMin], AVEncoderAudioQualityKey,
                                  [NSNumber numberWithInt:16], AVEncoderBitRateKey,
                                  [NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
                                  [NSNumber numberWithFloat:8000.0], AVSampleRateKey,
                                  [NSNumber numberWithInt:8], AVLinearPCMBitDepthKey,
                                  nil];

转换也是处理器密集型操作,如果您将此音频发送到服务器,您可以使用 FFMPEG 和 mp3lame 库在服务器上进行音频转换。

编辑:这是 Android 录制的代码,它设置为 AMR 编码,因为 AAC 仅支持 Honeycomb。

mediaRecorder = new MediaRecorder();
mediaRecorder.setAudiosource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setAudioChannels(1);
mediaRecorder.setOutputFile("sample.m4a");

【讨论】:

感谢您的帮助,但由于 .m4a 在 android 上不受支持,我如何从中获取 .AAC 文件。请告诉我。 我的 Android 开发伙伴给了我这个developer.android.com/guide/appendix/media-formats.html 在那里你可以看到你可以在 Android 上用 AAC 编码并保存一个 .m4a 文件,这样你就可以在 iOS 和 Android 上使用相同的 .m4a 格式没问题。 感谢您的精彩回复,现在我想知道如何在 android 中以编程方式进行调制(即更改音频的音高),然后将其转换为 .m4a 格式以便它可以正常工作两个.. 这似乎是一个不同的话题,所以我建议为那个话题打开一个新问题。就录音而言,只需使用我在此处发布的相同设置,就像在他们的 Android 对应项中一样,并将文件类型设置为 m4a,我也会使用 Android 代码更新我的答案。 对 Android 使用 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);。好测试!! :) 希望它可以帮助某人【参考方案2】:

您不能在 .mp3 文件中录制音频。 kAudioFormatMPEGLayer3 仅适用于 playback the .mp3 format audio。有no codec available for .mp3 recording。您需要以aacwav格式记录并转换为.mp3格式。

最好查看以下链接和图片:

Audio Recording Reference

这是一个学习转换音频格式的基础知识的链接:

Audio Converter Reference

【讨论】:

以上是关于在 iPhone 应用程序中以 mp3 格式录制音频的主要内容,如果未能解决你的问题,请参考以下文章

使用如何在 iPhone 中以 mp3 格式录制声音的音频队列服务示例

在android中使用MIC以mp3格式录制音频

iPhone 和 Android 可以录制和播放哪种音频格式?

iPhone:在没有麦克风的情况下录制输出声音

可以在 iphone sdk 中录制 mp3 吗?

使用音频队列框架录制的数据格式