使用AVAudioRecorder看似随机文件损坏(有时文件无法播放) - iOS

Cod*_*gle 14 audio corrupt audio-recording avaudiorecorder ios

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

现在所有这些在大多数情况下实际上都非常好.我可以坐下来录制并播放它们.我可以坐下来测试一下这个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;
Run Code Online (Sandbox Code Playgroud)

我像这样开始录音:

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];
}
Run Code Online (Sandbox Code Playgroud)

然后用这个来阻止它:

if (isRecording) {
    [audioRecorder stop];

    // Stop the timer
    [timeCheck invalidate];
}
Run Code Online (Sandbox Code Playgroud)

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

有没有人对可能导致文件损坏的问题有所了解?

Rap*_*tor 6

注意:由于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;
}
Run Code Online (Sandbox Code Playgroud)

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