сырые данные из CVImageBuffer без рендеринга? - PullRequest
5 голосов
/ 11 апреля 2011

Я получаю CVImageBufferRef от моего AVCaptureSession, и я хотел бы взять этот буфер изображения и загрузить его по сети.Чтобы сэкономить пространство и время, я хотел бы сделать это без рендеринга изображения в CIImage и NSBitmapImage, что является решением, которое я видел везде (например, здесь: Как я могу получить необработанные данные из объекта CVImageBuffer ).

Это потому, что у меня сложилось впечатление, что CVImageBuffer может быть сжат, что для меня здорово, и если я его рендеринг, мне нужно распаковать его в полный битовый образ, а затем загрузить весь битовый массив.Я хотел бы взять сжатые данные (понимая, что один сжатый кадр может быть позже сам по себе необратимым) так же, как он находится внутри CVImageBuffer.Я думаю, это означает, что мне нужен указатель базовых данных CVImageBuffer и его длина, но, похоже, нет способа получить это в API.У кого-нибудь есть идеи?

1 Ответ

8 голосов
/ 12 апреля 2011

CVImageBuffer сам по себе является абстрактным типом. Ваше изображение должно быть экземпляром CVPixelBuffer, CVOpenGLBuffer или CVOpenGLTexture. В документации по этим типам перечислены функции, которые вы можете использовать для доступа к данным.

Чтобы указать, какой тип у вас есть, используйте методы GetTypeID:

CVImageBufferRef image = …;
CFTypeID imageType = CFGetTypeID(image);

if (imageType == CVPixelBufferGetTypeID()) {
  // Pixel Data
}
else if (imageType == CVOpenGLBufferGetTypeID()) {
  // OpenGL pbuffer
}
else if (imageType == CVOpenGLTextureGetTypeID()) {
  // OpenGL Texture
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...