FFMPEG с C ++ получает доступ к веб-камере

Я искал все вокруг и не могу найти какие-либо примеры или учебники о том, как получить доступ к веб-камере с помощью ffmpeg в C ++. Любой пример кода или любая помощь, указывающая мне на некоторую документацию, будет принята с благодарностью.

Заранее спасибо.

3

Решение

Я работаю над этим уже несколько месяцев. Ваша первая «проблема» заключается в том, что ffmpeg (libavcodec и другие библиотеки ffmpeg) НЕ имеет доступа к веб-камерам или любому другому устройству.

Для обычной веб-камеры USB или карты захвата аудио / видео сначала необходимо программное обеспечение драйвера для доступа к этому устройству. Для linux эти драйверы попадают в категорию Video4Linux (как известно, V4L2), которые являются модулями большинства дистрибутивов. Если вы работаете с MS Windows, то вам нужно получить SDK, который позволит вам получить доступ к устройству. У MS может быть что-то для доступа к общим устройствам (но по моему опыту, они не очень способны, если они вообще работают). Если вы сделали это так далеко, то теперь у вас есть необработанные кадры (видео и / или аудио).

ТОГДА вы попадаете в часть ffmpeg — libavcodec — которая берет необработанные кадры (аудио и / или видео) и кодирует их в потоки, которые затем ffmpeg может мультиплексировать в ваш конечный контейнер.

Я искал, но нашел очень мало примеров всего этого, и большинство из них — кусочек еды.

Если вам на самом деле не нужно кодировать это самостоятельно, командная строка ffmpeg, как и vlc, может получить доступ к этим устройствам, захватывать и сохранять в файлы и даже передавать в потоковом режиме.

Это лучшее, что я могу сделать сейчас.

кругозор

1

Другие решения

Для окон используйте dshow

Для Linux (например, Ubuntu) используйте Video4Linux (V4L2).

FFmpeg может принимать входные данные от V4l2 и может выполнять процесс.

Чтобы найти путь к USB-видео, введите: ls / dev / video *
Например: / dev / video (n), где n = 0/1/2….

AVInputFormat — структура, которая содержит информацию о формате устройства ввода / формате медиа-устройства.

av_find_input_format («v4l2») [linux]

av_format_open_input (AVFormatContext, «/ dev / video (n)», AVInputFormat, NULL)
если возвращаемое значение равно! = 0, то ошибка.

Теперь вы получили доступ к камере с помощью FFmpeg и можете продолжить операцию.

Пример кода ниже.

    int CaptureCam()
{

avdevice_register_all(); // for device
avcodec_register_all();
av_register_all();

char *dev_name = "/dev/video0"; // here mine is video0 , it may vary.
AVInputFormat *inputFormat =av_find_input_format("v4l2");
AVDictionary *options = NULL;
av_dict_set(&options, "framerate", "20", 0);

AVFormatContext *pAVFormatContext = NULL;

// check video source
if(avformat_open_input(&pAVFormatContext, dev_name, inputFormat, NULL) != 0)
{
cout<<"\nOops, could'nt open video source\n\n";
return -1;
}
else
{
cout<<"\n Success !";
}

} // end function

Примечание: заголовочный файл < libavdevice / avdevice.h> должен быть включен

1

Это действительно не отвечает на этот вопрос, поскольку у меня нет для вас чистого решения ffmpeg, однако я лично использую Qt для доступа к веб-камере. Это C ++ и будет гораздо лучше API для этого. Однако он добавляет очень большую зависимость от вашего кода.

0

Это определенно зависит от веб-камеры — например, на работе мы используем IP-камеры, которые доставляют поток данных в формате JPEG по сети. USB будет другим.

Вы можете посмотреть образцы DirectShow, например, PlayCap (но они также показывают образцы AmCap и DVCap). Если у вас есть устройство ввода DirectShow (скорее всего, это будет то устройство, которое у вас будет изначально), вы можете подключить его к ffmpeg через устройство ввода dshow.

И потратив 5 минут на просмотр сайта ffmpeg, чтобы получить эти ссылки, я вижу, этот

0
По вопросам рекламы [email protected]