Posted at

CVPixelBufferからCMSampleBufferを生成する

CMSampleBufferを受け取って、編集済みのCVPixelBufferだけ差し込みたいときはCMSampleBufferにformatDescriptionやtimintInfoを加えてCMSampleBufferを作り直す。

extension CMSampleBuffer {

static func make(from pixelBuffer: CVPixelBuffer, formatDescription: CMFormatDescription, timingInfo: inout CMSampleTimingInfo) -> CMSampleBuffer? {
var sampleBuffer: CMSampleBuffer?
CMSampleBufferCreateForImageBuffer(allocator: kCFAllocatorDefault, imageBuffer: pixelBuffer, dataReady: true, makeDataReadyCallback: nil,
refcon: nil, formatDescription: formatDescription, sampleTiming: &timingInfo, sampleBufferOut: &sampleBuffer)
return sampleBuffer
}
}

CMFormatDescriptionは、元のPixelBufferからではなく編集済みのPixelBufferを元に作る必要がある。

そうじゃないとOSStatusのエラーが返ってくる。

extension CMFormatDescription {

static func make(from pixelBuffer: CVPixelBuffer) -> CMFormatDescription? {
var formatDescription: CMFormatDescription?
CMVideoFormatDescriptionCreateForImageBuffer(allocator: kCFAllocatorDefault, imageBuffer: pixelBuffer, formatDescriptionOut: &formatDescription)
return formatDescription
}
}