Ответ 1
Это проще, чем вы думаете.
Смотрите: AVCamDemo
- Захват данных с помощью AVCaptureVideoDataOutput.
- Создайте новую очередь отправки перед записью, например. recordQueue:
recordingQueue = dispatch_queue_create("Movie Recording Queue", DISPATCH_QUEUE_SERIAL);
-
В captureOutput: didOutputSampleBuffer: fromConnection: delegate метод, захват буфера выборки, сохранение его и запись очереди, напишите его в файл:
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CFRetain(sampleBuffer); dispatch_async(recordingQueue, ^{ if (assetWriter) { if (connection == videoConnection) { [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo]; } else if (connection == audioConnection) { [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio]; } } CFRelease(sampleBuffer); }); } - (void) writeSampleBuffer:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType { CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); if ( assetWriter.status == AVAssetWriterStatusUnknown ) { if ([assetWriter startWriting]) { [assetWriter startSessionAtSourceTime:presentationTime]; } else { NSLog(@"Error writing initial buffer"); } } if ( assetWriter.status == AVAssetWriterStatusWriting ) { if (mediaType == AVMediaTypeVideo) { if (assetWriterVideoIn.readyForMoreMediaData) { if (![assetWriterVideoIn appendSampleBuffer:sampleBuffer]) { NSLog(@"Error writing video buffer"); } } } else if (mediaType == AVMediaTypeAudio) { if (assetWriterAudioIn.readyForMoreMediaData) { if (![assetWriterAudioIn appendSampleBuffer:sampleBuffer]) { NSLog(@"Error writing audio buffer"); } } } } }