После того, как мы потратили немало времени на проблему без результата, я решил задать ее здесь.Запись видео с использованием AVCaptureVideoDataOutput в Swift 3
Мы используем AVCaptureVideoDataOutput
для получения данных о пикселях видео в реальном времени камеры и использования в функции captureOutput
. Но мы также хотим записать видео, используя эти данные. Кроме того, мы задаемся вопросом, была ли эта видеозапись сжата так же сильно, как записанное видео, которое было сделано с AVCaptureMovieFileOutput
.
Я хотел бы сообщить вам, что используя AVCaptureMovieFileOutput
мы сделали запись без проблем. Но AVCaptureMovieFileOutput
и AVCaptureVideoDataOutput
не работают одновременно.
Здесь вы можете найти функцию captureOutput
;
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
let baseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)
let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
videoWidth = CVPixelBufferGetWidth(imageBuffer)
videoHeight = CVPixelBufferGetHeight(imageBuffer)
let colorSpace = CGColorSpaceCreateDeviceRGB()
var bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
let context = CGContext(data: baseAddress, width: videoWidth, height: videoHeight, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)
let imageRef = context!.makeImage()
CVPixelBufferUnlockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
let data = imageRef!.dataProvider!.data as! NSData
let pixels = data.bytes.assumingMemoryBound(to: UInt8.self)
/* Because what we are doing with pixel data irrelevant to the question we omitted the rest of the code to make it simple */
}