AVCaptureSession的奇怪错误

Dim*_*r08 2 ios avcapturesession

我使用以下代码来设置AVCaptureSession,录制视频文件并播放它:有时这很好用,有时我在播放时会出现黑屏.据我所知,这是完全随机的.

当错误发生时,如果我尝试在quicktime中打开文件,我会收到"无法打开文件,格式无法识别"的消息.这让我相信它是一个录音问题而不是播放问题.

另外,如果注释掉添加麦克风输入的代码部分,则不会发生错误(但我的视频文件当然没有音频轨道)...所以也许音频源会随机破坏文件原因?

- (void)viewDidLoad {
[super viewDidLoad];

....

captureSession = [[AVCaptureSession alloc] init];
[captureSession setSessionPreset:AVCaptureSessionPresetHigh];

NSArray *devices = [AVCaptureDevice devices];
AVCaptureDevice *frontCamera;
AVCaptureDevice *mic = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];

for (AVCaptureDevice *device in devices) {

    NSLog(@"Device name: %@", [device localizedName]);

    if ([device hasMediaType:AVMediaTypeVideo]) 
    {
        if ([device position] == AVCaptureDevicePositionFront) {
            NSLog(@"Device position : front");
            frontCamera = device;
        }
    }
}

NSError *error = nil;

AVCaptureDeviceInput * microphone_input = [AVCaptureDeviceInput deviceInputWithDevice:mic error:&error];

AVCaptureDeviceInput *frontFacingCameraDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:frontCamera error:&error];

if (!error) 
{
    if ([captureSession canAddInput:frontFacingCameraDeviceInput])
    {
        [captureSession addInput:frontFacingCameraDeviceInput];
    }

    if([captureSession canAddInput:microphone_input])
    {
        [captureSession addInput:microphone_input];
    }

}
[captureSession startRunning];
}
Run Code Online (Sandbox Code Playgroud)

按下记录后,我将记录到"movie.mov"文件中:

movieOutput = [[AVCaptureMovieFileOutput alloc]init];
[captureSession addOutput:movieOutput];
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *pathString = [documentsDirectory stringByAppendingPathComponent:@"movie.mov"];
NSURL *pathUrl = [NSURL fileURLWithPath:pathString];

[movieOutput startRecordingToOutputFileURL:pathUrl recordingDelegate:self];
Run Code Online (Sandbox Code Playgroud)

当按下播放时,我播放电影文件:

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *pathString = [documentsDirectory stringByAppendingPathComponent:@"movie.mov"];
NSURL *pathUrl = [NSURL fileURLWithPath:pathString];

mPlayer = [AVPlayer playerWithURL:pathUrl];

[self.video setPlayer:self.mPlayer];
[video setVideoFillMode:@"AVLayerVideoGravityResizeAspectFill"];
[self.mPlayer play];
Run Code Online (Sandbox Code Playgroud)

我已经在这一段时间了,无法弄明白,它真的是随机的.任何帮助表示赞赏!

编辑:如果movie.mov文件已存在,我会在开始新录制之前将其删除.

编辑2:它可能与该行有关: [movieOutput startRecordingToOutputFileURL:pathUrl recordingDelegate:self]; Xcode给我一个"发送ViewController*const_strong'参数的不兼容类型'id'"警告在这一行

EDIT3:问题解决了,很快就会发布回复.谢谢!

Dim*_*r08 6

我想我已经弄明白了:

AVCaptureMovieFileOutput类有一个movieFragmentInterval变量,默认为10.因此,每10秒,一个"样本表"被写入quicktime文件.没有样本表,该文件是不可读的.

当我测试这个时,我的所有录音都很短,所以每当样本表没有写入文件时,似乎就会发生错误.这很奇怪,因为我在调用[movieOutput stopRecording]时会假设这会写出示例表,但我猜它没有.当我将fragmentInterval降低到5秒时:

CMTime fragmentInterval = CMTimeMake(5,1);

[movieOutput setMovieFragmentInterval:fragmentInterval];
[movieOutput startRecordingToOutputFileURL:pathUrl recordingDelegate:self];
Run Code Online (Sandbox Code Playgroud)

这个小虫似乎已经消失了.我仍然不确定为什么只有当麦克风被添加为输入设备时才会发生错误.