2015-11-27 37 views
4

iOS中的方式視頻輸出方式是AVFoundation嗎?iOS中的方形視頻輸出

我使用OpenGL處理​​視頻的每個幀(CMSampleBuffer)。每幀
被旋轉,所以我需要裁剪和旋轉CMSampleBuffer。但我不知道該怎麼做,所以我相信有一種方法可以通過在AVCaptureVideoDataOutput中設置屬性(videoSettings)來獲得已裁剪和旋轉的幀。

我用Google搜索了一下,用google搜索了一下,但什麼都沒發現。 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(); 
} 

它的鏡像和完美的我旋轉視頻輸出!但它不是裁剪!

回答

3

要旋轉CMSampleBuffer,你應該參加到這個蘋果技術說明:

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×100像素,全寬但裁剪的高度廣場。

退房AVVideoSettings.h鑰匙

+0

非常感謝你,它完美無缺! – vkalit

+0

你能告訴我,我該如何快速裁剪實時視頻?不是作家。 – vkalit

+0

嗨鑄造,你有消息的方式嗎?我有一些問題需要了解opencv等。與你交談會很愉快 –

-1

Thread致力於視頻作物和旋轉與GPUImage

+1

,是有辦法做到這一點沒有GPUImage的完整列表? – vkalit

+0

你應該更密集地使用谷歌:) https://www.one-dreamer.com/cropping-video-square-like-vine-instagram-xcode/ –

+0

年,我看到,當然,但還沒有嘗試過,因爲我懷疑這種方法。所以,似乎我必須嘗試 – vkalit