在iOS

时间:2017-05-23 17:39:18

标签: ios objective-c audio avaudiorecorder autosave

我创建的iOS应用程序具有录制音频几分钟的功能。我需要每10/20/30秒有一些自动保存功能,以便在应用程序崩溃/拨入电话/完全关闭应用程序时有一个后备。

我已经尝试过了:

  • 我在崩溃后尝试使用该文件,我可以在iTunes&在我的MacBook上播放,但我不能在应用程序中播放它(可能没有以正确的方式保存?)
  • 我尝试在录制时复制文件,但副本也不可行(可能是同样的原因?)
  • 根本不可能每隔几秒钟保存一次文件
  • 我尝试检测应用崩溃/关闭的时刻,然后快速保存文件并将其存储在本地。这是有效的,但不够可靠,所有代码都是在应用程序进入后台之前执行的。

如何制作某种自动保存功能,以便我始终对录制的音频文件进行回退?

我使用AVAudioRecorderAVAudioSession录制音频。导出音频文件(完成时或崩溃/关闭时)是使用AVMutableCompositionAVAssetExportSession完成的。

以下是我的一些初始化AVAudioRecorder

的代码
self.recorder = [[AVAudioRecorder alloc] initWithURL:filePath settings:_recordSetting error:NULL];
self.recorder.delegate = self;
self.recorder.meteringEnabled = YES;
[self.recorder prepareToRecord];

[[AVAudioSession sharedInstance] setActive:YES error:nil];

以下是我导出音频的方式:

AVMutableComposition* composition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *audioCombinedTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[audioCombinedTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [audio1 duration]) ofTrack:[audio1.tracks objectAtIndex:0] atTime:kCMTimeZero error:&error];
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetPassthrough];
NSString *latestFileName = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
NSString *exportPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.wav", latestFileName]];
_exportURL = [NSURL fileURLWithPath:exportPath];
exportSession.outputURL = _exportURL;
exportSession.outputFileType = AVFileTypeWAVE;

[exportSession exportAsynchronouslyWithCompletionHandler:^{
    NSLog (@"Exporting. status is %ld", (long)exportSession.status);
    switch (exportSession.status) {
        case AVAssetExportSessionStatusFailed:
            NSLog(@"export failed");
            break;
        case AVAssetExportSessionStatusExporting: {
            NSLog(@"export exporting");
            break;
        }
        case AVAssetExportSessionStatusCancelled: {
            NSLog(@"export cancelled");
            break;
        }
        case AVAssetExportSessionStatusWaiting: {
            NSLog(@"export waiting");
            break;
        }
        case AVAssetExportSessionStatusUnknown: {
            NSLog(@"export unknown");
            break;
        }
        case AVAssetExportSessionStatusCompleted: {
            NSLog(@"export done");
            break;
        }
    };
}];

注意:使用应用程序时(只需录制和停止录音机),音频文件会正确创建,一切正常。

0 个答案:

没有答案