AVVideoCompositing - Почему отображается первый видеокадр исходного клипа, а также новый составной видеокадр - PullRequest
0 голосов
/ 16 февраля 2019

Я использую пользовательский класс 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 }

}

Ожидаемые результаты должны быть только для нового составного видеокадра.Фактические результаты показывают, что первый кадр исходного видео отображается за новым составленным видеокадром.

...