iOS 8 iPad AVCaptureMovieFileOutput在录制13 – 14秒后丢失/丢失/从未获取音轨

我有以下代码适用于iOS 6和7.x.

在iOS 8.1中,我有一个奇怪的问题,如果您捕捉一个会话大约13秒或更长时间,则产生的AVAsset只有1个音轨(video),音轨不在那里。

如果录制的时间较短,则AVAsset有2个音轨(video和audio),如预期的那样。 我有足够的磁盘空间,应用程序有权使用相机和麦克风。

我用最less的代码创build了一个新项目,它重现了这个问题。

任何想法将不胜感激。

#import "ViewController.h" @interface ViewController () @end @implementation ViewController { enum RecordingState { Recording, Stopped }; enum RecordingState recordingState; AVCaptureSession *session; AVCaptureMovieFileOutput *output; AVPlayer *player; AVPlayerLayer *playerLayer; bool audioGranted; } - (void)viewDidLoad { [super viewDidLoad]; [self setupAV]; recordingState = Stopped; } -(void)setupAV { session = [[AVCaptureSession alloc] init]; [session beginConfiguration]; AVCaptureDevice *videoDevice = nil; for ( AVCaptureDevice *device in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] ) { if ( device.position == AVCaptureDevicePositionBack ) { videoDevice = device; break; } } AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; if (videoDevice && audioDevice) { AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil]; [session addInput:input]; AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil]; [session addInput:audioInput]; NSURL *recordURL = [self tempUrlForRecording]; [[NSFileManager defaultManager] removeItemAtURL:recordURL error:nil]; output= [[AVCaptureMovieFileOutput alloc] init]; output.maxRecordedDuration = CMTimeMake(45, 1); output.maxRecordedFileSize = 1028 * 1028 * 1000; [session addOutput:output]; } [session commitConfiguration]; } - (IBAction)recordingButtonClicked:(id)sender { if(recordingState == Stopped) { [self startRecording]; } else { [self stopRecording]; } } -(void)startRecording { recordingState = Recording; [session startRunning]; [output startRecordingToOutputFileURL:[self tempUrlForRecording] recordingDelegate:self]; } -(void)stopRecording { recordingState = Stopped; [output stopRecording]; [session stopRunning]; } - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { AVAsset *cameraInput = [AVAsset assetWithURL:[self tempUrlForRecording]]; //DEPENDING ON HOW LONG RECORDED THIS DIFFERS (<14 SECS - 2 Tracks, >14 SECS - 1 Track) NSLog(@"Number of tracks: %i", cameraInput.tracks.count); } -(id)tempUrlForRecording { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectoryPath = [paths objectAtIndex:0]; NSString *path = @"camerabuffer.mp4"; NSString *pathCameraInput =[documentsDirectoryPath stringByAppendingPathComponent: path]; NSURL *urlCameraInput = [NSURL fileURLWithPath:pathCameraInput]; return urlCameraInput; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 

这将帮助你解决它。

[movieOutput setMovieFragmentInterval:kCMTimeInvalid];

我认为这是一个错误。 该文档说如果logging没有成功完成,示例表不写入。 所以如果成功完成,它会自动写入。 但是现在看起来好像没有。

有任何想法吗?