Как добавить 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 я получаю правильные цвета при воспроизведении.