1

Я проходил через AV Foundation Programming Guide. В частности, я пытался собрать часть «Взять все это вместе» в разделе «Медиа-захват» для работы. Я внес некоторые незначительные изменения в код в учебнике, но ничего, что должно иметь большое влияние. Что меня смущает, как фактически сохранить файл фильма из AVCaptureMovieFileDataOutput. Я настроить захват сессии следующим:AVFoundation - Как сохранить файл 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]; 

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

ответ

6

Содержите ссылку на 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 s, треками, композициями и всеми вещами, прежде чем экспортировать его в качестве финального фильма. Действительно классный материал. Однако это довольно жесткая структура и разочарование, когда вещи кажутся обратными - FYI существует три типа ориентации на устройствах iOS, поэтому поворот видео заставит вас хотеть вытащить ваши волосы.

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

+0

Очень информативный. Является ли 'movieFileOutput' в вашем коде выше, предположительно, моим объектом AVCaptureMovieFileOutput? Кроме того, я не предполагаю, что у вас есть ссылка на описательный учебник или какой-то исходный код простой реализации, который это делает? – golmschenk

+0

Да, это объект AVCaptureMovieFileOutput. Поэтому держать ссылку вокруг - хорошая идея. Я бы честно сказал, что лучший способ обойти все это - посмотреть на документацию Apple - ресурсов не так много. В частности, исследования 'AVCaptureMovieFileOutput',' AVURLAsset', 'AVMutableComposition' и' AVAssetExportSession'. Большинство ресурсов связаны с «AVCaptureVideoDataOutput», которые являются одиночными кадрами - игнорируйте их, они здесь неактуальны. – bgoers

+0

Хорошо, спасибо. – golmschenk

5

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

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) 
Смежные вопросы