我在四处搜索过,找不到任何关于如何使用C ++中的ffmpeg访问网络摄像头的示例或教程。任何示例代码或任何帮助指向我的一些文档,将非常感激。
提前致谢。
答案 0 :(得分:1)
我几个月来一直在研究这个问题。你的第一个“问题”是ffmpeg(libavcodec和其他ffmpeg libs)不访问网络摄像头或任何其他设备。
对于基本USB网络摄像头或音频/视频捕获卡,首先需要驱动程序软件才能访问该设备。对于Linux,这些驱动程序属于Video4Linux(众所周知的V4L2)类别,这些模块是大多数发行版的一部分。如果您使用的是MS Windows,那么您需要获得一个允许您访问该设备的SDK。 MS可能有一些东西可以访问通用设备,(但根据我的经验,如果他们工作的话他们不是很有能力)如果你已经做到这一点,那么你现在有了原始帧(视频和/或音频)。
然后你到了ffmpeg部分 - libavcodec - 它接收原始帧(音频和/或视频)并将它们编码成一个流,然后ffmpeg可以复制到你的最终容器中。
我搜索过,但发现所有这些的例子很少,而且大多数都是零食。
如果您不需要自己实际编写代码,命令行ffmpeg以及vlc可以访问这些设备,捕获并保存到文件,甚至是流。
这是我现在能做的最好的事情。
肯
答案 1 :(得分:1)
对于Windows使用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
注意:头文件&lt; libavdevice / avdevice.h&gt;必须包括
答案 2 :(得分:0)
这真的没有回答这个问题,因为我没有为您提供纯粹的ffmpeg解决方案,但是,我个人使用Qt进行网络摄像头访问。它是C ++,将有一个更好的API来实现这一目标。但它确实会对您的代码添加非常大的依赖性。
答案 3 :(得分:0)
这绝对取决于网络摄像头 - 例如,在工作中我们使用IP摄像头通过网络传输jpeg数据流。 USB会有所不同。
您可以查看DirectShow示例,例如PlayCap(但它们也会显示AmCap和DVCap示例)。一旦你有了一个directshow输入设备(你可能有本机提供的任何设备)你可以通过dshow input device将它连接到ffmpeg。
我花了5分钟浏览ffmpeg网站获取这些链接,我看到this ...