Квадратный видеовыход в 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

Другие вопросы по тегам