2

我一直在阅读AV Foundation Programming Guide。特别是,我一直在尝试让“媒体捕获”部分中的“将所有内容放在一起”部分工作。我对教程中的代码做了一些小改动,但没有什么影响太大。我对如何从 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];

我可能只是在开发人员文档中遗漏了一些我没有看到的东西,但我还没有看到如何真正让会话创建文件。有什么建议么?非常感谢!

4

2 回答 2

7

保留对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、轨道、合成和各种事物。真的很酷的东西。然而,它是一个相当困难的框架,有时当事情似乎倒退时令人沮丧 - 仅供参考,iOS 设备上有三种类型的方向,所以视频的旋转会让你想要拔出你的头发。

不过,我真的可以连续几天谈论功能和挫败感,所以只要有可能,请务必查阅 Apple 的文档。这应该让你走上正轨!

于 2013-04-15T17:11:32.337 回答
7

希望有人会发现这很有用,这是一个将视频录制到文件中的快速代码的完整示例:

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)
于 2015-04-29T22:14:54.073 回答