Простая покадровая библиотека видеодекодера - PullRequest
3 голосов
/ 22 сентября 2010

Я ищу простую библиотеку c / c ++, которая позволила бы извлечь первый кадр видео в виде массива uchar.И у меня есть простая функция для доступа к следующему.

Я знаю о FFMPEG, но он требует игры с пакетом и тому подобным, и я удивлен, что нигде в сети я не могу найти библиотеку, которая позволяетчто-то вроде:

Video v = openVideo ("путь");uchar * data = v.getFrame ();v.nextFrame ();

Мне просто нужно извлечь кадры видео, чтобы использовать его в качестве текстуры ... нет необходимости перекодировать после или что-нибудь ...

конечно, что-то, чтопрочитал бы максимально возможный формат, что было бы здорово, что-то, построенное, например, на libavcodec; p

И я использую Windows 7

Спасибо!

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

Вот пример с OpenCV:

#include <cv.h>
#include <highgui.h>

int
main(int argc, char **argv)
{       
    cv::VideoCapture capture(argv[1]);
    if (capture.grab())
    {   
        cv::Mat_<char> frame;
        capture.retrieve(frame);
        //
        // Convert to your byte array here
        //
    }    
    return 0;
}

Он не тестировался, но я убрал его из некоторого существующего рабочего кода, поэтому вам не понадобится много времени, чтобы он заработал.

cv::Mat_<unsigned char> по сути является байтовым массивом. Если вам действительно нужно что-то явно типа unsigned char *, то вы можете использовать malloc пространства соответствующего размера и выполнять итерации по матрице, используя

Вы можете преобразовать cv::Mat в байтовый массив, используя позиции пикселей (cv::Mat_::at()) или итераторы (cv::Mat_::begin() и друзья).

Существует множество причин, по которым библиотеки редко предоставляют данные изображения в виде простого указателя, например:

  • Это означает, что все изображение должно занимать непрерывное пространство в памяти. Это большое дело при работе с большими изображениями
  • Требуется зафиксировать определенный порядок данных (пиксель по сравнению с неплоскими - плоскости RGB хранятся с перемежением или раздельно?) И снижает гибкость
  • Разыменование указателей является причиной ошибок (переполнения буфера и т. Д.).

Так что, если вы хотите указатель, вы должны немного поработать для него.

1 голос
/ 10 февраля 2011

Вы можете использовать OpenCV, это очень просто, и у них есть полезное руководство на их сайте http://opencv.willowgarage.com/wiki/

0 голосов
/ 22 сентября 2010

Использовать DirectShow. Вот статья: http://www.codeproject.com/KB/audio-video/framegrabber.aspx Есть DirectShow «дополнения» для декодирования различных форматов видео. Вот один из сайтов, где можно получить бесплатные пакеты фильтров DirectShow для декодирования некоторых распространенных форматов, которые не поддерживаются DirectShow напрямую: http://www.free -codecs.com / download / DirectShow_FilterPack.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...