iOS 中的方形视频输出
Square video output in iOS
有没有办法在iOS中通过AVFoundation
获得方形视频输出?
我使用 OpenGL 处理视频的每一帧 (CMSampleBuffer
)。每帧
被旋转了,所以我需要裁剪和旋转 CMSampleBuffer
。但我不知道该怎么做,所以我相信有一种方法可以通过在 AVCaptureVideoDataOutput
.
中设置属性 (videoSettings
) 来获得已经裁剪和旋转的帧
我在谷歌上搜索、搜索和搜索,但一无所获。
swift 中的代码示例会很棒。
更新:
我在 Swift 中的完整最终解决方案:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
captureSession = AVCaptureSession()
captureSession!.sessionPreset = AVCaptureSessionPreset640x480
let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
var error: NSError?
var input: AVCaptureDeviceInput!
do {
input = try AVCaptureDeviceInput(device: backCamera)
} catch let error1 as NSError {
error = error1
input = nil
}
if error == nil && captureSession!.canAddInput(input) {
captureSession!.addInput(input)
stillImageOutput = AVCaptureStillImageOutput()
stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG, kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA)]
if captureSession!.canAddOutput(stillImageOutput) {
captureSession!.addOutput(stillImageOutput)
}
}
videoOutput = AVCaptureVideoDataOutput()
videoOutput!.videoSettings = [kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA), AVVideoWidthKey : 100, AVVideoHeightKey: 100]
videoOutput!.setSampleBufferDelegate(self, queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL))
if captureSession!.canAddOutput(self.videoOutput) {
captureSession!.addOutput(self.videoOutput)
}
videoOutput!.connectionWithMediaType(AVMediaTypeVideo).videoOrientation = AVCaptureVideoOrientation.PortraitUpsideDown
videoOutput!.connectionWithMediaType(AVMediaTypeVideo).videoMirrored = true
captureSession!.startRunning();
}
它的镜像和旋转视频输出非常适合我!但它没有裁剪!
要旋转 CMSampleBuffer,您应该注意这个 Apple 技术说明:
https://developer.apple.com/library/ios/qa/qa1744/_index.html
特别是,如果您想物理 旋转视频(而不是仅仅设置方向标志),您可以..
例如在回调中:
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
如果你这样做:
[connection setVideoOrientation:AVCaptureVideoOrientationPortraitUpsideDown];
您将获得一个颠倒的视频。
要裁剪视频,您需要使用 AVAssetWriterInput,您可以在其中使用 videoSettings 字典设置裁剪。
例如:
NSDictionary *videoSettings = @{
AVVideoCodecKey : AVVideoCodecH264
, AVVideoWidthKey : @(100)
, AVVideoHeightKey : @(100)
};
此处使用:
self.assetWriterVideoInput = [[AVAssetWriterInput alloc]
initWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings];
将为您提供一个大小为 100 x 100 像素、全宽但高度裁剪为正方形的视频。
查看 AVVideoSettings.h
以获得完整的键列表
有没有办法在iOS中通过AVFoundation
获得方形视频输出?
我使用 OpenGL 处理视频的每一帧 (CMSampleBuffer
)。每帧
被旋转了,所以我需要裁剪和旋转 CMSampleBuffer
。但我不知道该怎么做,所以我相信有一种方法可以通过在 AVCaptureVideoDataOutput
.
videoSettings
) 来获得已经裁剪和旋转的帧
我在谷歌上搜索、搜索和搜索,但一无所获。 swift 中的代码示例会很棒。
更新:
我在 Swift 中的完整最终解决方案:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
captureSession = AVCaptureSession()
captureSession!.sessionPreset = AVCaptureSessionPreset640x480
let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
var error: NSError?
var input: AVCaptureDeviceInput!
do {
input = try AVCaptureDeviceInput(device: backCamera)
} catch let error1 as NSError {
error = error1
input = nil
}
if error == nil && captureSession!.canAddInput(input) {
captureSession!.addInput(input)
stillImageOutput = AVCaptureStillImageOutput()
stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG, kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA)]
if captureSession!.canAddOutput(stillImageOutput) {
captureSession!.addOutput(stillImageOutput)
}
}
videoOutput = AVCaptureVideoDataOutput()
videoOutput!.videoSettings = [kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA), AVVideoWidthKey : 100, AVVideoHeightKey: 100]
videoOutput!.setSampleBufferDelegate(self, queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL))
if captureSession!.canAddOutput(self.videoOutput) {
captureSession!.addOutput(self.videoOutput)
}
videoOutput!.connectionWithMediaType(AVMediaTypeVideo).videoOrientation = AVCaptureVideoOrientation.PortraitUpsideDown
videoOutput!.connectionWithMediaType(AVMediaTypeVideo).videoMirrored = true
captureSession!.startRunning();
}
它的镜像和旋转视频输出非常适合我!但它没有裁剪!
要旋转 CMSampleBuffer,您应该注意这个 Apple 技术说明:
https://developer.apple.com/library/ios/qa/qa1744/_index.html
特别是,如果您想物理 旋转视频(而不是仅仅设置方向标志),您可以..
例如在回调中:
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
如果你这样做:
[connection setVideoOrientation:AVCaptureVideoOrientationPortraitUpsideDown];
您将获得一个颠倒的视频。
要裁剪视频,您需要使用 AVAssetWriterInput,您可以在其中使用 videoSettings 字典设置裁剪。
例如:
NSDictionary *videoSettings = @{
AVVideoCodecKey : AVVideoCodecH264
, AVVideoWidthKey : @(100)
, AVVideoHeightKey : @(100)
};
此处使用:
self.assetWriterVideoInput = [[AVAssetWriterInput alloc]
initWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings];
将为您提供一个大小为 100 x 100 像素、全宽但高度裁剪为正方形的视频。
查看 AVVideoSettings.h
以获得完整的键列表