Я искал все вокруг и не могу найти какие-либо примеры или учебники о том, как получить доступ к веб-камере с помощью ffmpeg в C ++. Любой пример кода или любая помощь, указывающая мне на некоторую документацию, будет принята с благодарностью.
Заранее спасибо.
Я работаю над этим уже несколько месяцев. Ваша первая «проблема» заключается в том, что ffmpeg (libavcodec и другие библиотеки ffmpeg) НЕ имеет доступа к веб-камерам или любому другому устройству.
Для обычной веб-камеры USB или карты захвата аудио / видео сначала необходимо программное обеспечение драйвера для доступа к этому устройству. Для linux эти драйверы попадают в категорию Video4Linux (как известно, V4L2), которые являются модулями большинства дистрибутивов. Если вы работаете с MS Windows, то вам нужно получить SDK, который позволит вам получить доступ к устройству. У MS может быть что-то для доступа к общим устройствам (но по моему опыту, они не очень способны, если они вообще работают). Если вы сделали это так далеко, то теперь у вас есть необработанные кадры (видео и / или аудио).
ТОГДА вы попадаете в часть ffmpeg — libavcodec — которая берет необработанные кадры (аудио и / или видео) и кодирует их в потоки, которые затем ffmpeg может мультиплексировать в ваш конечный контейнер.
Я искал, но нашел очень мало примеров всего этого, и большинство из них — кусочек еды.
Если вам на самом деле не нужно кодировать это самостоятельно, командная строка ffmpeg, как и vlc, может получить доступ к этим устройствам, захватывать и сохранять в файлы и даже передавать в потоковом режиме.
Это лучшее, что я могу сделать сейчас.
кругозор
Для окон используйте 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> должен быть включен
Это действительно не отвечает на этот вопрос, поскольку у меня нет для вас чистого решения ffmpeg, однако я лично использую Qt для доступа к веб-камере. Это C ++ и будет гораздо лучше API для этого. Однако он добавляет очень большую зависимость от вашего кода.
Это определенно зависит от веб-камеры — например, на работе мы используем IP-камеры, которые доставляют поток данных в формате JPEG по сети. USB будет другим.
Вы можете посмотреть образцы DirectShow, например, PlayCap (но они также показывают образцы AmCap и DVCap). Если у вас есть устройство ввода DirectShow (скорее всего, это будет то устройство, которое у вас будет изначально), вы можете подключить его к ffmpeg через устройство ввода dshow.
И потратив 5 минут на просмотр сайта ffmpeg, чтобы получить эти ссылки, я вижу, этот…