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的曲目,曲目,曲目以及各种各样的东西之前,将其导出为最终的电影。真的很酷的东西。然而,这是一个相当困难的框架,并且在事情似乎倒退的时候令人沮丧 - 仅供参考,iOS设备上有三种方向,因此视频的旋转会让您想要把头发拉出来。

虽然我可以从字面上继续讨论功能和沮丧的日子,但是,只要可能,请务必查阅Apple的文档。这应该让你走上正轨!

+0

非常丰富。上面代码中的'movieFileOutput'是否是我的AVCaptureMovieFileOutput对象?另外,我不认为你有链接到描述性教程或一个简单实现的源代码,这是否是你的? – golmschenk

+0

是的,它是AVCaptureMovieFileOutput对象。所以保持一个参考是一个好主意。我诚实地说,最好的办法是看看苹果的文档 - 没有太多的其他资源。具体来说,研究'AVCaptureMovieFileOutput','AVURLAsset','AVMutableComposition'和'AVAssetExportSession'。大多数资源处理AVCaptureVideoDataOutput这是单帧 - 忽略这些,它们在这里是不相关的。 – bgoers

+0

好,太好了,谢谢。 – golmschenk

5

希望有人会觉得这是有用的,这是一个SWIFT代码录制视频到一个文件一个完整的例子:

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)