CVImageBuffer
действительно наследуется от CVBuffer
, но только таким образом, что "симулируется объектная ориентация в c". То есть, если вы знаете, что тип CVBuffer
относится к определенному подклассу, вы можете безопасно привести к этому типу, например:
if (CFGetTypeID(myCVBuffer) == CVMetalTextureGetTypeID()) {
CVMetalTextureRef metalBuffer = myCVBuffer;
// do something with metalBuffer
}
На самом деле вам даже не нужно приводить (даже в Swift!), поскольку все типы CVBuffer
одинаковы (typealias
es в Swift):
typedef CVBufferRef CVImageBufferRef;
typedef CVImageBufferRef CVPixelBufferRef;
typedef CVImageBufferRef CVMetalTextureRef;
// ...
Вы заметили, что CVBuffer
— это абстрактный базовый класс, но, возможно, вы пропустили, что CVImageBuffer
тоже абстрактен: он добавляет несколько функций, связанных с размерами изображения и цветовыми пространствами, и определяет ключи прикрепления изображения для доступа к метаданным, специфичным для изображения.
Я предполагаю, что ваши изображения имеют размер CGImage
, поскольку вы используете AVAssetImageGenerator
. На данный момент у вас есть два варианта. Вы можете преобразовать CGImage
-> CVPixelBuffer
и добавить это непосредственно к AVAssetWriterInputPixelBufferAdaptor
, которое вы добавляете к своему AVAssetWriterInput
. Или вы можете создать CMSampleBuffer
из CVPixelBuffer
, созданного выше, используя CMSampleBufferCreateReadyWithImageBuffer
, и добавить его непосредственно к вашему AVAssetWriterInput
.
Некоторые люди предпочитают подход с адаптером пиксельного буфера, но, честно говоря, оба вышеупомянутых подхода пугают и неэффективно (например, я не думаю, что вы можете создать CVPixelBuffer
без копирования CGImage
пикселей), так почему бы не сбросить AVAssetImageGenerator
и его нежелательные CGImage
и напрямую использовать AVAssetReader
+ AVAssetReaderOutput
? Это даст CMSampleBuffer
, которые вы можете добавить без конвертации* к вашему вводу писателя, и у вас будет больше шансов не ненавидеть свою жизнь.
* на самом деле вам может понадобиться изменить временную отметку буфера сэмпла, что довольно просто: CMSampleBufferCreateCopyWithNewTiming
person
Rhythmic Fistman
schedule
19.01.2016