gpt4 book ai didi

macos - 使用 AVFoundation (OSX) 向视频添加过滤器 - 如何将生成的图像写回 AVWriter?

转载 作者:行者123 更新时间:2023-12-01 01:01:36 27 4
gpt4 key购买 nike

设置场景

我正在开发一个视频处理应用程序,该应用程序从命令行运行以读取、处理然后导出视频。我正在使用 4 首轨道。

  • 我将许多剪辑附加到单个轨道中以制作一个视频。我们称之为 ugcVideoComposition。
  • 位于第二个轨道上并使用层指令的带有 Alpha 的剪辑在导出时设置为合成以在 ugcVideoComposition 的顶部播放。
  • 一个音乐音轨。
  • ugcVideoComposition 的音频轨道,包含来自附加到单个轨道的剪辑的音频。

  • 我有这一切工作,可以合成它并使用 AVExportSession 正确导出它。

    问题

    我现在要做的是对 ugcVideoComposition 应用滤镜和渐变。

    到目前为止,我的研究表明,这是通过使用 AVReader 和 AVWriter,提取 CIImage,使用过滤器对其进行操作,然后将其写出来来完成的。

    我还没有得到上述所有功能,但我已经设法使用 AssetReader 和 AssetWriter 将 ugcVideoComposition 读入并写回磁盘。

        BOOL done = NO;
    while (!done)
    {
    while ([assetWriterVideoInput isReadyForMoreMediaData] && !done)
    {
    CMSampleBufferRef sampleBuffer = [videoCompositionOutput copyNextSampleBuffer];
    if (sampleBuffer)
    {
    // Let's try create an image....
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CIImage *inputImage = [CIImage imageWithCVImageBuffer:imageBuffer];

    // < Apply filters and transformations to the CIImage here

    // < HOW TO GET THE TRANSFORMED IMAGE BACK INTO SAMPLE BUFFER??? >

    // Write things back out.
    [assetWriterVideoInput appendSampleBuffer:sampleBuffer];

    CFRelease(sampleBuffer);
    sampleBuffer = NULL;
    }
    else
    {
    // Find out why we couldn't get another sample buffer....
    if (assetReader.status == AVAssetReaderStatusFailed)
    {
    NSError *failureError = assetReader.error;
    // Do something with this error.
    }
    else
    {
    // Some kind of success....
    done = YES;
    [assetWriter finishWriting];

    }
    }
    }
    }

    如您所见,我什至可以从 CMSampleBuffer 中获取 CIImage,并且我相信我可以弄清楚如何操作图像并应用我需要的任何效果等。我不知道如何将生成的操纵图像放回 SampleBuffer 中,以便我可以再次将其写出来。

    问题

    给定一个 CIImage,我如何将其放入 sampleBuffer 中以将其附加到assetWriter?

    任何帮助表示赞赏 - AVFoundation 文档很糟糕,或者错过了关键点(例如如何在提取图像后将其放回原处,或者专注于将图像渲染到 iPhone 屏幕上,这不是我想要做的。

    非常感谢和感谢!

    最佳答案

    尝试使用:SDAVAssetExportSession
    SDAVAssetExportSession on GITHub

    然后实现一个委托(delegate)来处理 像素

    - (void)exportSession:(SDAVAssetExportSession *)exportSession renderFrame:(CVPixelBufferRef)pixelBuffer withPresentationTime:(CMTime)presentationTime toBuffer:(CVPixelBufferRef)renderBuffer

    { Do CIImage and CIFilter inside here }

    关于macos - 使用 AVFoundation (OSX) 向视频添加过滤器 - 如何将生成的图像写回 AVWriter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22819337/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com