В настоящее время я экспериментирую с CoreImage, изучая, как применять фильтры CIF к каналу камеры. В настоящее время мне удалось взять канал с камеры, применить фильтр и записать канал в AVAssetWriter в виде видео, но у меня возникла одна проблема, заключающаяся в том, что в процессе фильтрации я фактически обрезаю данные изображения так что он всегда имеет квадратные размеры (необходимые для других аспектов проекта)
Мой процесс выглядит следующим образом:
- Подача захвата с использованием AVCaptureSession
- Возьмите CMSampleBufferRef из выходных данных захвата и получите CVPixelBufferRef
- Получите базовый адрес CVPixelBufferRef и создайте CGBitmapContext, используя базовый адрес в качестве данных (чтобы мы могли его перезаписать)
- Преобразование CVPixelBufferRef в CIImage (используя один из конструкторов CIImage)
- Применение фильтров к CIImage
- Преобразование CIImage в CGImageRef
- Отрисовка CGImageRef в CGBitmapContext (что приводит к перезаписи содержимого примеров буфера)
- Добавьте CMSampleBufferRef к входу AVAssetWriterInput.
Не рисуя CGImageRef в контекст, вот что я получаю:
После отрисовки CGImageRef в контекст вот что я получаю:
В идеале я просто хочу иметь возможность сообщить CMSampleBufferRef, что у него есть новые измерения, поэтому дополнительная информация опущена. Но мне интересно, придется ли мне вообще создавать новый CMSampleBufferRef.
Любая помощь будет принята с благодарностью!