#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.