看似随机文件损坏使用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;

我开始录制如下:

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];
}

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

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

解决方法

注意:由于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 userInfo] description]);
   return;
}

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

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...