Добавление фильтров к видео с помощью 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, что я не хочу делать).
Высоко ценится и спасибо!