Сжатие видео с использованием созданного пиксельного буфера в формате kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange - PullRequest
3 голосов
/ 17 октября 2011

У меня есть двухплоскостные необработанные данные видеобуфера в формате YCbCr, которые я использую в качестве источника для сжатия одного нового видео mp4 / mov в формате H.264 на iPhone и iPad. Поэтому я использую CVPixelBufferRef для создания нового пиксельного буфера, а затем AVAssetWriterInputPixelBufferAdaptor для добавления в программу записи видео.

Однако, когда я вызываю appendPixelBuffer с новым пиксельным буфером с данными YCbCr, appendPixelBuffer возвращает YES только для первого добавленного кадра. Все остальные кадры отклоняются автором (возвращая NO). Проблема в том, что если я использую необработанные видеоданные формата BGRA32, все работает нормально, поэтому мне интересно, есть ли у меня неправильно созданный пиксельный буфер в формате YCbCr.

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

1) Использование CVPixelBufferCreateWithBytes:

cvErr = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
                                     videoWidth_,
                                     videoHeight_,
                                 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
                                     [videoFrame getBaseAddressOfPlane:0],
                                     [videoFrame getBytesPerRowOfPlane:0],
                                     NULL,
                                     NULL,
                                     NULL,
                                     &pixelBuffer);

2) Использование CVPixelBufferCreateWithPlanarBytes:

cvErr = CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault,
                                           videoWidth_,
                                           videoHeight_,
                                 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
                                           NULL,
                                           0,
                                           videoFrame.planeCount,
                                           planeBaseAddress,
                                           planeWidth,
                                           planeHeight,
                                           planeStride,
                                           NULL,
                                           NULL,
                                           NULL,
                                           &pixelBuffer);

planeBaseAddress, planeWidth, planeHeight, planeStride - это двумерные массивы, содержащие базовый адрес, ширину, высоту и шаг плоскости Y и плоскости CbCr.

Так вы можете показать мне, где я делаю что-то не так, или есть какой-то пример кода, на который я могу сослаться, или это проблема iPhone SDK?

...