FFMPEG与c++访问一个网络摄像头

FFMPEG with C++ accessing a webcam

本文关键字:一个 网络 摄像头 c++ 访问 FFMPEG      更新时间:2023-10-16

我到处搜索,找不到任何关于如何在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网站来获取这些链接,我看到了这个