AVAudioRecorder在iPhone 5S上无法工作

13

所以我正在使用AVAudioRecorder录制音频,同时使用记录视频的AVCaptureSession(我知道这很奇怪,但对于我的情况,我需要分别记录它们)。

除了iPhone 5S之外,所有设备上一切正常。它可以成功录音,但保存到磁盘上的文件损坏或其他问题。当我在Mac上访问文件系统并尝试使用VLC或Quicktime播放m4a文件时,会出现“无法检测文件格式”的错误。以下是我初始化AVAudioRecorder和录制音频的方法:

// Prepare the audio session
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeVideoRecording error:nil];

 // Setup audio recording
 NSDictionary *recordSettings = @{AVFormatIDKey: @(kAudioFormatMPEG4AAC),
                                      AVEncoderAudioQualityKey: @(AVAudioQualityLow),
                                      AVEncoderBitRateKey: @16,
                                      AVNumberOfChannelsKey: @1,
                                      AVSampleRateKey: @22050.0f};

 NSError *audioRecorderError;

 NSURL *audioFileURL = [[self.outputFileURL URLByDeletingPathExtension] URLByAppendingPathExtension:@"m4a"];

 self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:audioFileURL
                                                              settings:recordSettings
                                            error:&audioRecorderError];

self.audioRecorder.delegate = self;

 if (audioRecorderError) {
      CCLog(@"Error while initializing the audio recorder... Skipping sound recording!");
 }
else {
    if (![self.audioRecorder prepareToRecord]) {
        CCLog(@"Error preparing to record");
    }
    if (![self.audioRecorder record]) {
        CCLog(@"Error recording");
    }
}

同样的代码在除了iPhone 5S以外的所有设备上都能正常工作。有人知道可能是什么原因导致这个问题吗?


你尝试过使用另一个5S手机来确保问题不是出在你的手机或其操作系统上吗? - HalR
是的,我测试过的每个5S手机都会出现这种情况。 - codyko
是的,我尝试了我的5S,但它不工作。我的iPad2(iOS7)和iPhone4(iOS7)都工作良好。这真的很奇怪。 - user418751
3个回答

28

我做了更多的调查,显然我找到了解决方案。我只是摆脱了AVEncoderBitRateKey,所有事情都正常工作了。所以现在我的recordSettings字典看起来像这样:


我进行了进一步的调查,似乎找到了解决方案。我只需删除AVEncoderBitRateKey,一切就能正常工作。因此,我的recordSettings字典现在看起来像这样:
// Setup audio recording
NSDictionary *recordSettings = @{AVFormatIDKey: @(kAudioFormatMPEG4AAC),
                                  AVEncoderAudioQualityKey: @(AVAudioQualityLow),
                                  AVNumberOfChannelsKey: @1,
                                  AVSampleRateKey: @22050.0f};

我仍然不确定为什么只有在 iPhone 5S 上会出现这种情况。我已经在运行 iOS6 和 iOS7 的所有其他设备上进行了测试,旧的设置字典在除了 5S 以外的所有设备上都可以正常工作。现在我已经删除了 AVEncoderBitRateKey 和值,它也可以在 5S 上运行。


2
这相当令人不安,事实上这样做确实有效,但为什么?! - Rob
@Rob 我完全同意。我接受了自己的回答作为答案,因为它解决了问题。但我同意我也很想知道为什么会这样。 - codyko
1
我遇到了类似的情况,但是在Retina iPad mini上。如果我删除AVEncoderBitRateKeyAVFormatIDKey,它就可以录制。如果我将这两个都留下,它就不行。不知道为什么。我相信这段代码在第三代iPad上可以工作。也许与64位处理器有关? - swilliams
@codyko 非常感谢。我有一个类似的问题,但只在iPadAir上RecordSound时出现,但是当删除AVEncoderBitRateKey时完美运行。我想这可能与几个麦克风有关。 - Beto
我在iPad Mini Retina和iPhone5S上遇到了类似的问题。我的代码在模拟器上可以运行,你的也一样,但是在这两个设备上都无法工作。我一直在尝试调整设置,甚至传递了一个nil的设置,但都没有帮助。 - schystz
1
iOS8,iPhone 6,仍然相关。 - CupawnTae

0
我曾经遇到了同样的问题,答案与 AVAudioSession 有关。我需要将音频会话类别设置为 PlayAndRecord,而我的应用程序的其他部分则将其设置为 Ambient。这篇文章 https://dev59.com/DWLVa4cB1Zd3GeqP0dwR#10287793 给了我答案。希望这可以帮助到某些人,我为此浪费了一个星期天。

0

看起来这实际上是 AVNumberOfChannelsKeyAVEncoderBitRateKey 之间的交互。当通道数=1时,我似乎无法录制高于64000Kbps的内容,但当通道数=2时,我可以使用128000...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接