【问题标题】:Seemingly random file corruption using AVAudioRecorder (Sometimes the file can't be played back) - iOS使用 AVAudioRecorder 看似随机的文件损坏(有时无法播放文件) - iOS
【发布时间】:2012-03-31 01:57:06
【问题描述】:

在我目前正在开发的应用程序中,我或多或少遇到了障碍。在应用程序中,您可以输入一个视图,该视图在标准表格视图中列出了所有本地保存的音频文件。从这里您可以点击它们进行播放,或者点击下方的录制按钮进行新的录制,之后会自动保存到应用沙箱中。

现在,大多数情况下,所有这些实际上都可以正常工作。我可以坐下来录音和回放。我可以坐下来测试大约 45 次,没有任何问题。然后突然间,我会遇到一个非常奇怪的问题。问题是录音机突然开始只保存损坏的文件,这些文件无法播放,大小正好为 4096 字节,无论您录音多久。

我以完全标准的方式使用 AVAudioRecorder,设置如下:

// Specific settings for the audio recording
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithInt:AVAudioQualityMin],
    AVEncoderAudioQualityKey,
    [NSNumber numberWithInt:8], 
    AVEncoderBitRateKey,
    [NSNumber numberWithInt: 2], 
    AVNumberOfChannelsKey,
    [NSNumber numberWithFloat:22000.0], 
    AVSampleRateKey,
    nil];

NSError *error = nil;
audioRecorder = [[AVAudioRecorder alloc]
    initWithURL:contentURL
    settings:recordSettings
    error:&error];
audioRecorder.delegate = self;

我是这样开始录音的:

if (!isRecording) {
    isRecording = YES;
    [audioRecorder record];

    // Start the timer
    recordTiming = [NSDate date];

    timeCheck = [NSTimer
        scheduledTimerWithTimeInterval:1.0f
        target:self
        selector:@selector(timeCheck)
        userInfo:nil
        repeats:YES];
}

然后用这个停止它:

if (isRecording) {
    [audioRecorder stop];

    // Stop the timer
    [timeCheck invalidate];
}

我不知道是什么导致了这个问题的发生。到目前为止,我几乎尝试了所有方法。我已经检查以确保记录器对象被正确回收(所以你现在每个记录都有一个新实例),并且旧引用被释放等等,以确保它与干扰对象无关,但没有什么能解决它。

有没有人知道什么可能导致文件损坏的问题?

【问题讨论】:

  • 所以你是说在audioRecorder初始化后error变量总是nil,对吧?
  • 是的,正确 :) 实际上,我在下面对 NSLog 进行了一些快速错误检查,以确保它已正确初始化并且 NSError 为 nil 等等。
  • 知道了,让我们改进你的代码,问题可能会变得明显或消失。您可以使用 audioRecorder 属性记录,而不是使用 isRecording var;我看不到音频会话初始化,但您可能只是忽略了它。但是我建议你也改进错误处理,下面的答案可以作为参考:stackoverflow.com/questions/1010343/…
  • 是的,我现在尝试改进一些错误处理 :) 我还将错误缩小到开始录制时,即在以下行:[audioRecorder record];我发现在某些情况下它会随机返回 NO。其他人建议我应该在录制之前开始音频会话。我还没有得到这个错误,但也许它仍然存在。很难说时间可能是如此随机:) 你认为音频会话可以发挥作用吗?顺便说一句,谢谢你到目前为止的帮助:) 非常感谢。
  • 我应该这样认为,因为那是我在您的另一个问题上提出的。根据我的经验

标签: ios audio audio-recording avaudiorecorder corrupt


【解决方案1】:

注意:由于 OP 有几天不活动,我想应该回答这个问题以供公众将来参考,因此我发布了这个答案。

在开始录制之前必须获得AVAudioSession

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *err = nil;
[audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
if(err){
   NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
   return;
}
err = nil;
[audioSession setActive:YES error:&err];
if(err){
   NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
   return;
}

参考:https://stackoverflow.com/a/9706731/188331

【讨论】:

  • 这确实是问题:) 我已经有一段时间没有检查我的旧问题了,所以我很抱歉,但这确实是问题的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
相关资源
最近更新 更多