AVAudioRecorder - 正确的 MPEG4 AAC 录制设置

Posted

技术标签:

【中文标题】AVAudioRecorder - 正确的 MPEG4 AAC 录制设置【英文标题】:AVAudioRecorder - Proper MPEG4 AAC Recording Settings 【发布时间】:2012-07-05 15:35:57 【问题描述】:

我有一个实时应用,估计有 15% 的用户报告说记录功能不起作用。这在我们的测试设备上没有发生,但报告显示问题是 prepareToRecord 返回 NO。我很难找到 AAC 格式的示例设置。我的任何设置都关闭了吗?应用需要 ios5 并使用 ARC。

 AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryRecord error:nil];

NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
 [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,
 [NSNumber numberWithFloat:44100.0], AVSampleRateKey,
 [NSNumber numberWithInt:1], AVNumberOfChannelsKey,
 [NSNumber numberWithInt:AVAudioQualityHigh], AVSampleRateConverterAudioQualityKey,
 [NSNumber numberWithInt:128000], AVEncoderBitRateKey,
 [NSNumber numberWithInt:16], AVEncoderBitDepthHintKey,
 nil];

NSString *fileName = [NSString stringWithFormat:@"%@%@.caf", verseGUID, bRecordingReference ? @"_ref" : @""];
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@", [[Utilities sharedInstance] documentsDirectoryPath], fileName]];
NSError *error = nil;
audioRecorder = [[AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error];
if([audioRecorder prepareToRecord])
    [audioRecorder record];
else
    int errorCode = CFSwapInt32HostToBig([error code]);
    NSLog(@"Error: %@ [%4.4s])", [error localizedDescription], (char*)&errorCode);
  

【问题讨论】:

您是否在当前支持 iOS 5 的所有设备上测试过此应用程序?也许这个问题与硬件有关? 我们已经在 iPhone 4s、iPod Touch 第 4 代和 iPhone 3GS 上报告了这个问题,但它不会影响这些相同设备上的其他用户。我们已经在 iPhone 4s、iPhone 4、iPod Touch 第 4 代和 iPad 1 上进行了测试,但未能重现该问题。 这会在 sim 卡中崩溃。 我的理解是您应该只在设备上进行测试,因为它们使用完全不同的音频硬件。我还看到了一些关于使用 iOS5 在 Sim 中录制和播放音频问题的报告,如下所述:***.com/questions/6906930/… 但是,如果您看到您认为可能导致模拟器和设备出现问题的特定设置,请告诉我。 【参考方案1】:

可能有很多事情与录制设置无关。

您想要回答的真正问题似乎是:什么会导致录制不发生?

audioRecorder 可能为 nil,或者 audioRecorder prepareToPlay 可能返回 NO。前者似乎更有可能。

传递给 initWithURL 的 url 可能格式不正确: - 您是否通过使用 verseGUID、bRecordReference 值进行了测试?也许您的设备永远不会有错误的 verseGUID,但是没有发生录制的设备的 verseGUID 为零/空。这可能会导致文件名只是“.caf”。

您似乎有自己的类方法 [Utilities sharedInstance] 。由于某种原因,这可以在您的设备上工作,但不能在故障设备上工作吗?如果是这样,您可能会在您无意中要求记录在***目录中。

您能否将您拥有的测试人员列入“测试版”列表?注册 TestFlight 或 Hockey Kit 之类的东西,让一个或多个录制失败的用户也注册,然后上传您的应用程序的测试版,其中包含诊断程序,在屏幕上显示一个对话框并显示“错误”。这可能是最明显的。我使用 testflightapp.com 只是因为它是我第一次尝试,它对我来说很容易管理并且对我的 beta 测试人员来说非常轻松。

【讨论】:

+50 用于 TestFlight 推荐,因为赏金期已过。如果有人可以确认我的录制设置有效,我仍然会喜欢它。苹果在这些方面的文档非常缺乏。【参考方案2】:

试试这个我用来录制 MPEG 4 AAC 格式的设置...效果很好..

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: 1], AVNumberOfChannelsKey,
                                  [NSNumber numberWithFloat:8000.0], AVSampleRateKey,
                                  nil];

【讨论】:

感谢发帖。这是我一直在寻找的响应类型,但是,我对其中一些设置感到有些困惑。为什么在录制 AAC 时指定了 LinearPCM 属性?此外,16 的比特率似乎没有意义。那不是位深度的值吗?我的理解是比特率是以比特每秒为单位的。 我不知道我们需要为比特率提供多少。我刚刚有一个使用这个设置的工作代码,我只是简单地给你。 可能我也需要自己查看这些设置的文档。 就是这样,Apple 不提供有关这些设置的有用文档。 我在 iOS 7 上尝试了这些设置,AVEncoderBitRateKey 设置使录制失败(它会输出一个只有标题的空文件)。我最终使用了这些设置:@AVFormatIDKey: @(kAudioFormatMPEG4AAC), AVEncoderAudioQualityKey: @(AVAudioQualityMin), AVSampleRateKey: @16000.0, AVNumberOfChannelsKey: @1;【参考方案3】:

抱歉,这有点切题,但我刚刚遇到了一个非常相似的问题,许多用户无法录制,我认为这与音频设置有关。

但对我来说,事实证明他们拒绝了访问麦克风的权限。这意味着 prepareToRecord 正在工作(并截断文件),而 record 报告它正在工作,但实际上它没有记录任何内容。

当我想录制时,我使用了这个:

AVAudioSession.sharedInstance().requestRecordPermission((granted: Bool)-> Void in
    if granted 
        // can record - create AVAudioRecorder here

     else 
        // can't record - update UI (or react accordingly)
    
)

如果遇到类似问题,希望它能节省一些时间。

【讨论】:

以上是关于AVAudioRecorder - 正确的 MPEG4 AAC 录制设置的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioRecorder swift 2

MADDPG(MPE)——环境配置与用法详细介绍(多智能体强化学习))

AVAudioRecorder 录制 AAC/m4a

IOS 8 AVAudioRecorder 更改示例格式

iOS音频与视频的开发- 使用AVAudioRecorder进行录制音频

wav,wma,rm,rmvb,mpe,mpeg,mpg,avi,dat,asf,mov,mp4,flv,3gp区别?