Adicionando filtros ao vídeo com o AVFoundation (OSX) - como gravar a imagem resultante no AVWriter?

Preparando a cena

Estou trabalhando em um aplicativo de processamento de vídeo que é executado na linha de comando para ler, processar e depois exportar vídeo. Estou trabalhando com 4 faixas.

Muitos clipes que eu anexo em uma única faixa para fazer um vídeo. Vamos chamar isso de ugcVideoComposition.Os clipes com Alpha, posicionados em uma segunda faixa e usando as instruções da camada, são configurados na exportação para serem reproduzidos na parte superior do ugcVideoComposition.Uma faixa de áudio de música.Uma trilha de áudio para o ugcVideoComposition contendo o áudio dos clipes anexados à trilha única.

Eu tenho tudo isso funcionando, posso compor e exportar corretamente usando o AVExportSession.

O problema

Agora, o que eu quero fazer é aplicar filtros e gradientes ao ugcVideoComposition.

Até agora, minha pesquisa sugere que isso é feito usando o AVReader e o AVWriter, extraindo um CIImage, manipulando-o com filtros e depois escrevendo isso.

Ainda não tenho toda a funcionalidade que tinha acima, mas consegui ler e gravar o ugcVideoComposition novamente em disco usando o AssetReader e o 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];

                }
            }
         }
      }

Como você pode ver, posso até obter o CIImage no CMSampleBuffer, e estou confiante de que posso descobrir como manipular a imagem e aplicar quaisquer efeitos, etc. O que não sei fazer é colocar a imagem manipulada resultante VOLTAR no SampleBuffer para que eu possa escrevê-la novamente.

A questão

Dada uma CIImage, como posso colocá-la em um sampleBuffer para anexá-la ao assetWriter?

Qualquer ajuda apreciada - a documentação do AVFoundation é terrível e perde pontos cruciais (como recuperar uma imagem depois de extraí-la ou concentra-se em renderizar imagens na tela do iPhone, que não é o que eu quero fazer.

Muito apreciado e obrigado!

questionAnswers(2)

yourAnswerToTheQuestion