Как добавить colorProfile с помощью AVAssetWriter к видео, записанному с экрана с помощью CGDisplayStream

Я написал приложение для записи экрана, которое записывает видеофайлы H.264, используя VideoToolbox и AVWriter. Цвета в записанных файлах немного тусклые по сравнению с исходным экраном. Я знаю, что это если, потому что colorProfile не хранится в видео-файл.

Это тесно связано с тем, как управлять цветом вывода AVAssetWriter

Я создал тестовую площадку, чтобы показать это на github ScreenRecordTest

Если вы запустите это приложение, вы можете начать запись, используя CMD-R, и остановить его, используя тот же CMD-R (Вы должны начать и остановить запись один раз, чтобы получить полностью записанный файл фильма). Вы найдете запись в папке /tmp/ под именем, похожим на это: "/tmp/grab-2018-10-25 09:23:32 +0000.mov"

При записи приложение отображает два живых изображения: а) кадр, полученный из CGDisplayStream, и б) cmSampleBuffer, который вышел из компрессора.

Я обнаружил, что IOSurface, который возвращается из CGDisplayStream, не управляется цветом, поэтому вы заметите "тусклые" цвета уже перед сжатием. Если вы откомментируете строку 89 в AppDelegate.swift

// cgImage = cgImage.copy(colorSpace: screenColorSpace)!

этот предварительный просмотр будет иметь правильные цвета. Теперь это только для отображения IOSurface перед сжатием. Я понятия не имею, как заставить другой live-preview (после сжатия) (строка 69 в AppDelegate) показывать правильные цвета (скажем: как применить colorProfile к CMSampleBuffer) или самое важное, как пометить записанный видео-файл с помощью правильный профиль, так что при открытии файла.mov я получаю правильные цвета при воспроизведении.

0 ответов

Другие вопросы по тегам