AssetReader/AssetWriter — CMSampleBuffer и CALayer

#swift #calayer #cmsamplebuffer

Вопрос:

Я перекодирую видео, чтобы вставить рисунки ML Vision в новое видео. Подход заключается в использовании avassetreader и avassetwriter. Я передаю cmsamplebuffer в vision и получаю результаты. Я строю calayer с учетом результатов. Я не уверен, как согласовать cmsamplebuffer с calayer с чертежами.

Вот фрагмент

 func transcode(completion: @escaping (AVURLAsset) -gt; Void) {    var videoComposition = AVVideoComposition()  var composition = AVComposition(url: model.assetInfo.asset.url)  let tracks = composition.tracks(withMediaType: .video)  var videoSettings = [String(kCVPixelBufferPixelFormatTypeKey): NSNumber(value: kCVPixelFormatType_420YpCbCr8PlanarFullRange)]    let videoCompositionOutput = AVAssetReaderVideoCompositionOutput(videoTracks: tracks, videoSettings: videoSettings)    videoCompositionOutput.videoComposition = videoComposition    if reader.canAdd(videoCompositionOutput) {  reader.add(videoCompositionOutput)  }  else {  fatalError()  }    self.reader.startReading()    var isDone = false    while(!isDone) {  if let buffer = videoCompositionOutput.copyNextSampleBuffer(),  let imageBuffer = CMSampleBufferGetImageBuffer(buffer) {    let ciimage = CIImage(cvImageBuffer: imageBuffer)  let context = CIContext()    if let cgImage = context.createCGImage(ciimage, from: ciimage.extent) {  let uiImage = UIImage(cgImage: cgImage)    let frame = CGRect(origin: .zero, size: uiImage.size)    let visionDirector = VisionDirector()    visionDirector.createVisionProductByDrawingTypeAndBuffer(drawingType: .ML, cmSampleBuffer: buffer) {  (visionProduct) in    let model = CALayerFactoryByDrawTypeModel(frame: frame, drawingType: .ML, visionProduct: visionProduct)  let factory = CALayerFactoryByDrawType(model: model)  let layer = factory.build()    //how do we get the calayer embedded on the cmsamplebuffer?  //then we'll stream the cmsamplebuffer in the avassetwriter for a new video.  }    }    }  else {  if self.reader.status == .failed, let error = reader.error?.localizedDescription {  fatalError(error)  }  else {  isDone = true  }  }    } }  

Комментарии:

1. Попробуйте AVAssetWriterInputPixelBufferAdaptor . Вы можете найти образцы на Github.