Технические вопросы и ответы QA1839

Указание информации о цветовом пространстве для пиксельных буферов

Q: Почему делает AVAssetWriterInputPixelBufferAdaptor appendPixelBuffer:withPresentationTime: сбой метода с AVAssetWriter ошибочный набор свойств к-12917 (kVTInsufficientSourceColorDataErr) когда я пытаюсь записать пиксельные буферы, не выделенные от предоставленного CVPixelBufferPool к выходному файлу?

A:-12917 (kVTInsufficientSourceColorDataErr) ошибка указывает, что цветовое пространство не было указано для буферов исходного пикселя. Если Вы не используете пиксельные буферы, выделенные от предоставленного CVPixelBufferPool для AVAssetWriterInputPixelBufferAdaptor экземпляры необходимо указать информацию о цветовом пространстве для буферов.

Для RGB исходные буферы, набор kCVImageBufferICCProfileKey или kCVImageBufferCGColorSpaceKey присоединение на буфере. Вот пример того, как установить присоединение цветового пространства для RGB пиксель буферизует на OS X:

Перечисление 1  , Указывающее присоединение цветового пространства для RGB пиксель буферизует на OS X.

CGColorSpaceRef sRGBColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
if (sRGBColorSpace != NULL)
{
    CFDataRef sRGBProfileData = CGColorSpaceCopyICCProfile(sRGBColorSpace);
    if (sRGBProfileData != NULL)
    {
        NSDictionary *pbAttachements =
                    @{(id)kCVImageBufferICCProfileKey : (id)sRGBProfileData};
 
        CFRelease(sRGBProfileData);
 
        CVBufferRef pixelBuffer = <#Your pixel buffer#>;
 
        /* set the color space attachment on the buffer */
        CVBufferSetAttachments(pixelBuffer,
                    (CFDictionaryRef)pbAttachements, kCVAttachmentMode_ShouldPropagate);
    }
    else
    {
        NSLog(@"CGColorSpaceCopyICCProfile returned NULL");
 
        /* handle the error */
    }
 
    CFRelease(sRGBColorSpace);
}
else
{
    NSLog(@"CGColorSpaceCreateWithName returned NULL");
 
    /* handle the error */
}

Установите kCVImageBufferYCbCrMatrixKey, kCVImageBufferColorPrimariesKey, и kCVImageBufferTransferFunctionKey присоединения для описания YUV буферы. Вот пример:

Перечисление 2  , Указывающее присоединение цветового пространства для YUV пиксельные буферы.

NSDictionary *pbAttachments =
    @{(id)kCVImageBufferYCbCrMatrixKey:(id)kCVImageBufferYCbCrMatrix_ITU_R_709_2,
     (id)kCVImageBufferColorPrimariesKey:(id)kCVImageBufferColorPrimaries_ITU_R_709_2,
     (id)kCVImageBufferTransferFunctionKey:(id)kCVImageBufferTransferFunction_ITU_R_709_2};
CVBufferRef pixelBuffer = <#Your pixel buffer#>;
CVBufferSetAttachments(pixelBuffer,
    (CFDictionaryRef)pbAttachments, kCVAttachmentMode_ShouldPropagate);


История версии документа


ДатаПримечания
05.06.2014

Новый документ, описывающий, как указать информацию о цветовом пространстве для пиксельных буферов