Я работаю над проектом видеоплеера на iOS.
Он использует AVFoundation для извлечения CVPixelBuffer из видеофайла, а затем отправить этот буфер в OpenGL в виде текстур.
Код для проверки концепции основан на образец кода Apple. AVFoundation предоставляет каждый кадр в цветовом пространстве YCbCr, и его необходимо преобразовать в RGB для визуализации в OpenGL. Это преобразование, похоже, имеет несколько вариантов матрицы преобразования в зависимости от различных стандартов YCbCr (например, ITU-R BT.709, ITU-R BT.601). Пример кода определяет, какой из них использовать, с помощью следующего кода:
CFTypeRef colorAttachments = CVBufferGetAttachment(pixelBuffer, kCVImageBufferYCbCrMatrixKey, NULL); if (colorAttachments == kCVImageBufferYCbCrMatrix_ITU_R_601_4) { _preferredConversion = kColorConversion601; } else { _preferredConversion = kColorConversion709; }
Однако я использую swift, и возвращаемый результат colorAttachment
имеет тип Unmanaged<CFTypeRef>
, а константа kCVImageBufferYCbCrMatrix_ITU_R_601_4
имеет тип CFString
, поэтому они не могут быть приравнены напрямую. Я провел небольшое исследование и в итоге получил:
CFEqual(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_601_4) // returns false
CFEqual(colorAttachments, kCVImageBufferYCbCrMatrix_ITU_R_709_2) // returns false too!!
//-----------------------------------------
CFGetType(colorAttachments) // returns 1
CFStringGetType() // returns 7, note kCVImageBufferYCbCrMatrix_ITU_R_601_4 is of type CFString
// so I still can't check their equality
// because the retrieved colorAttachments is not of type CFString at all
Я попробовал два преобразования один за другим, жестко закодировав матрицу, и результат (визуализированная сцена) не кажется человеческому глазу разницы, что предсказуемо, потому что две матрицы преобразования не сильно различаются.
Мои вопросы:
- Как определить, какое преобразование использовать?
- Если невозможно решить [1.], могу ли я жестко закодировать любой из них? каковы последствия этого?