iOS
Swift

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
  }
}