Я использую пользовательский класс AVVideoCompositing для применения эффектов, визуальных эффектов и преобразований к видеокадрам.Однако создается впечатление, что исходный первый видеокадр воспроизводится за новыми составными видеокадрами, что приводит к дублированию видео.
func pixelBufferFromPassthrough(for request: AVAsynchronousVideoCompositionRequest, currentInstruction: BloopeVideoCompositionInstruction) -> CVPixelBuffer? {
let buffer: CVPixelBuffer
if let frameBuffer = request.sourceFrame(byTrackID: currentInstruction.trackId) {
buffer = frameBuffer
} else if let blankBuffer = renderContext?.newPixelBuffer() {
buffer = blankBuffer
} else {
return nil
}
guard let dstPixels = renderContext?.newPixelBuffer() else { return buffer }
if renderContextDidChange { renderContextDidChange = false }
var filters = currentInstruction.clip.getFiltersForAdjustment()
let transform = NSValue(cgAffineTransform: transformFor(clip: currentInstruction.clip))
filters["CIAffineTransform"] = [kCIInputTransformKey: transform]
applyFilters(filters: filters, buffer: buffer, dstPixels: dstPixels)
return dstPixels
}
func applyFilters(filters: [String: [String: Any]], buffer: CVPixelBuffer, dstPixels: CVPixelBuffer) {
let context = CIContext(options: nil)
var outputImage = CIImage(cvPixelBuffer: buffer)
for (filter, values) in filters {
outputImage = applyFilter(name: filter, values: values, image: outputImage) ?? outputImage
}
let cSpace = CGColorSpaceCreateDeviceRGB()
context.render(outputImage, to: dstPixels, bounds: CGRect(x: 0, y: 0, width: 1280, height: 720), colorSpace: cSpace)
}
func applyFilter(name: String, values: [String: Any], image: CIImage) -> CIImage? {
if let currentFilter = CIFilter(name: name) {
currentFilter.setDefaults()
currentFilter.setValue(image, forKey: kCIInputImageKey)
for (key, value) in values {
currentFilter.setValue(value, forKey: key)
}
if let output = currentFilter.outputImage {
return output
} else { return nil }
} else { return nil }
}
Ожидаемые результаты должны быть только для нового составного видеокадра.Фактические результаты показывают, что первый кадр исходного видео отображается за новым составленным видеокадром.