使用C ++访问网络摄像头的FFMPEG

时间:2014-03-12 05:38:48

标签: c++ ffmpeg libavcodec

我在四处搜索过,找不到任何关于如何使用C ++中的ffmpeg访问网络摄像头的示例或教程。任何示例代码或任何帮助指向我的一些文档,将非常感激。

提前致谢。

4 个答案:

答案 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 ...