какая связь между CVBuffer и CVImageBuffer

если вы проверите этот документ от Apple

https://developer.apple.com/library/tvos/documentation/QuartzCore/Reference/CVBufferRef/index.html#//apple_ref/c/tdef/CVBufferRef

В самой второй строке говорится, что: «Объект CVBuffer может содержать видео, аудио или, возможно, какой-либо другой тип данных. Вы можете использовать программный интерфейс CVBuffer для любого буфера Core Video». Это означает, что он также может хранить изображения. Если да, то зачем нам CVImageBuffer.

Я только что проделал некоторую работу по созданию изображений из видео с помощью AVAssetImageGenerator. Теперь я хочу объединить кадры, чтобы сделать видео. Итак, я только начал читать об этом.

Мой текущий статус:
1. Ну, прямо сейчас я знаю, что мне нужно использовать AVAssetWriter.
2. Затем мне нужно предоставить ему ввод с помощью AVAssetWriterInput.
3. Мне нужно использовать CV и CG классы.

Поэтому, пожалуйста, помогите мне узнать причину использования CVImageBuffer, если у нас есть CVBuffer. Я знаю, что CVBuffer является абстрактным, но тогда CVImageBuffer не наследуется от CVBuffer. Это сбивает меня с толку еще больше.


person Reckoner    schedule 16.01.2016    source источник


Ответы (1)


CVImageBuffer действительно наследуется от CVBuffer, но только таким образом, что "симулируется объектная ориентация в c". То есть, если вы знаете, что тип CVBuffer относится к определенному подклассу, вы можете безопасно привести к этому типу, например:

if (CFGetTypeID(myCVBuffer) == CVMetalTextureGetTypeID()) {
    CVMetalTextureRef metalBuffer = myCVBuffer;
    // do something with metalBuffer
}

На самом деле вам даже не нужно приводить (даже в Swift!), поскольку все типы CVBuffer одинаковы (typealiases в 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
comment
Спасибо, но что означает эта смоделированная объектная ориентация в стиле c? Не могли бы вы уточнить? - person Reckoner; 22.01.2016
comment
CoreVideo — это C API, а язык C не имеет наследования как языковой функции. Однако вы можете смоделировать его с оговорками (доказательство/интересный факт: С++, у которого есть наследование, используется для компиляции в C - до тех пор, пока исключения не заставят людей сдаться). Вот пример одного из способов моделирования наследования в C: codeproject.com/Articles/108830/ - person Rhythmic Fistman; 22.01.2016
comment
Это отвечает на ваш вопрос? - person Rhythmic Fistman; 31.01.2016