Квадратный видеовыход в iOS
Есть ли способ получить квадратный видео выход AVFoundation
в iOS?
Я использую OpenGL для обработки каждого кадра (CMSampleBuffer
) видео. Каждый кадр
вращается, поэтому мне нужно обрезать и вращать CMSampleBuffer
, Но я не знаю, как это сделать, поэтому я считаю, что есть способ получить уже обрезанные и повернутые кадры, установив свойства (videoSettings
) в AVCaptureVideoDataOutput
,
Я погуглил, погуглил и погуглил, но ничего не нашел. Пример кода на 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();
}
Это зеркальное отображение и вращение видео выхода идеально для меня! Но это не обрезка!
2 ответа
Чтобы повернуть 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
для полного списка ключей
Тема, посвященная кадрированию и ротации видео с помощью GPUImage