AVFoundation – Как сохранить файл AVCaptureMovieFileDataOutput в файл?

Я проходил руководство по программированию AV Foundation . В частности, я пытался собрать часть «Взять все это вместе» в разделе «Медиа-захват» для работы. Я внес некоторые незначительные изменения в код в учебнике, но ничего, что должно иметь большое влияние. Что меня смущает, как фактически сохранить файл фильма из AVCaptureMovieFileDataOutput. Я настраиваю сеанс захвата следующим образом:

//Create session. AVCaptureSession *session = [[AVCaptureSession alloc] init]; //Set preset to low. if ([session canSetSessionPreset:AVCaptureSessionPresetLow]) { session.sessionPreset = AVCaptureSessionPresetLow; } else { // Handle the failure. } //Get camera device. AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; NSError *error = nil; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; if (!input) { //Handle the error appropriately. } [session addInput:input]; //Create output. AVCaptureMovieFileOutput *output = [[AVCaptureMovieFileOutput alloc] init]; [session addOutput:output]; [session startRunning]; 

Я могу просто пропустить что-то в документах разработчика, которых я не вижу, но я не видел, как на самом деле получить сеанс для создания файла. Какие-либо предложения? Спасибо много!

Сохраните ссылку на AVCaptureMovieFileOutput . Это пригодится.

Во всяком случае, существует метод этого класса, который можно вызвать так:

 [[self movieFileOutput] startRecordingToOutputFileURL:url recordingDelegate:self]; 

где url – это URL-адрес файла на устройстве, например каталог документов. Это позволяет начать запись. Вы также можете заметить, что вы можете остановить его, вызвав [[self movieFileOutput] stopRecording]; , Вам также необходимо реализовать методы AVCaptureFileOutputRecordingDelegate для обработки обратных вызовов. Эти методы вызывают, когда запись начинается и заканчивается, так:

 -(void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections; -(void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error; 

Вы должны реализовать эти методы делегатов, чтобы справиться с тем, что происходит, когда вы начинаете и завершаете запись. В методе didFinishRecording вы можете AVAssetURL с AVAssetURL , треками, композициями и всякими вещами, прежде чем экспортировать его в качестве финального фильма. Действительно классный материал. Однако это довольно жесткая структура и разочарование, когда вещи кажутся обратными – FYI существует три типа ориентации на устройствах iOS, поэтому поворот видео заставит вас хотеть вытащить ваши волосы.

Тем не менее, я мог буквально продолжать работу над функциями и разочарованиями, поэтому просто не забудьте проконсультироваться с документами Apple, когда это возможно. Это должно привести вас к правильному пути!

Надеюсь, кто-то найдет это полезным, это полный пример быстрой записи видео в файл:

 import Foundation import AVFoundation import UIKit // Video Delegate class VideoDelegate : NSObject, AVCaptureFileOutputRecordingDelegate { func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) { println("capture output : finish recording to \(outputFileURL)") } func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) { println("capture output: started recording to \(fileURL)") } } 

После этого вызов startRecordingToOutputFileURL (Предполагаемый сеанс – это AVCaptureSession):

 let videoDelegate = VideoDelegate() let fileOutput = AVCaptureMovieFileOutput() session.addOutput(fileOutput) let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString let outputPath = "\(documentsPath)/output.mov" let outputFileUrl = NSURL(fileURLWithPath: outputPath) fileOutput.startRecordingToOutputFileURL(outputFileUrl, recordingDelegate: videoDelegate)