Добавление фильтров к видео с помощью AVFoundation (OSX) - как мне записать полученное изображение обратно в AVWriter?

Настройка сцены

Я работаю над приложением для обработки видео, которое запускается из командной строки для чтения, обработки и экспорта видео. Я работаю с 4 треками.

Много клипов, которые я добавляю в один трек, чтобы сделать одно видео. Давайте назовем это ugcVideoComposition.Клипы с альфа-каналом, которые позиционируются на второй дорожке и с использованием инструкций слоя, устанавливаются композитными при экспорте для воспроизведения поверх верхней части ugcVideoComposition.Музыкальная звуковая дорожка.Аудиодорожка для композиции ugcVideoComposition, содержащая звук из клипов, добавленных в одну дорожку.

У меня все это работает, могу скомпоновать его и правильно экспортировать с помощью AVExportSession.

Эта проблема

Теперь я хочу применить фильтры и градиенты к ugcVideoComposition.

Мои исследования до сих пор показывают, что это делается с помощью AVReader и AVWriter, извлечения CIImage, манипулирования им с помощью фильтров и последующей записи этого.

Я еще не получил всю функциональность, с которой работал выше, но мне удалось получить чтение и запись ugcVideoComposition на диск с помощью AssetReader и AssetWriter.

    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];

                }
            }
         }
      }

Как вы можете видеть, я даже могу получить CIImage из CMSampleBuffer, и я уверен, что смогу разобраться, как манипулировать изображением и применять любые эффекты и т.д., которые мне нужны. То, что я не знаю, как сделать, это поместить получившееся манипулированное изображение BACK в SampleBuffer, чтобы я мог записать его снова.

Вопрос

Учитывая CIImage, как я могу поместить это в sampleBuffer, чтобы добавить его с assetWriter?

Любая помощь приветствуется - документация AVFoundation ужасна и либо пропускает важные моменты (например, как вернуть изображение после того, как вы его извлекли, либо фокусируется на рендеринге изображений на экран iPhone, что я не хочу делать).

Высоко ценится и спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос