我到处搜索,找不到任何关于如何在c++中使用ffmpeg访问网络摄像头的示例或教程。任何示例代码或任何帮助指向我的一些文档,将非常感激。
我已经为此工作了几个月了。你的第一个"问题"是ffmpeg (libavcodec和其他ffmpeg库)不能访问网络摄像头,或任何其他设备。
对于基本的USB网络摄像头或音频/视频采集卡,您首先需要驱动程序软件来访问该设备。对于linux,这些驱动程序属于Video4Linux(众所周知的V4L2)类别,这些模块是大多数发行版的一部分。如果你使用的是微软Windows,那么你需要获得一个允许你访问设备的SDK。微软可能有一些东西可以访问通用设备,(但从我的经验来看,他们不是很有能力,如果他们工作的话)如果你已经做到了这一点,那么你现在有原始帧(视频和/或音频)。
然后你进入ffmpeg部分- libavcodec -它接受原始帧(音频和/或视频)并将它们编码成流,然后ffmpeg可以将其混合到最终容器中。
我已经搜索过了,但是找到的所有这些例子很少,而且大多数都是零敲碎打的。
如果您不需要自己编写这些代码,那么命令行ffmpeg以及vlc可以访问这些设备,捕获并保存到文件中,甚至流式传输。
这是我目前能做的最好的了。
肯对于windows使用dshow
对于Linux(如ubuntu)使用Video4Linux (V4L2)
FFmpeg可以从V4l2获取输入,并可以执行该过程。
查找USB视频路径,输入ls/dev/video*例如:/dev/video(n) where 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 sourcenn";
return -1;
}
else
{
cout<<"n Success !";
}
} // end function
注意:头文件必须包含
这真的没有回答这个问题,因为我没有一个纯粹的ffmpeg解决方案给你,但是,我个人使用Qt网络摄像头访问。它是c++,并且会有更好的API来完成这个任务。然而,它确实对你的代码增加了很大的依赖。
这肯定取决于网络摄像头——例如,在工作中,我们使用IP摄像头通过网络传输jpeg数据流。USB会有所不同。
你可以看看DirectShow样本,例如PlayCap(但他们也显示AmCap和DVCap样本)。一旦您有了一个directshow输入设备(无论您拥有的是什么设备,都有可能是本机提供的),您就可以通过dshow输入设备将它连接到ffmpeg。
花了5分钟浏览了ffmpeg网站来获取这些链接,我看到了这个