Adicionando filtros ao vídeo com o AVFoundation (OSX) - como gravar a imagem resultante no AVWriter?
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 problemaAgora, 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ãoDada 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!