【问题标题】:FFMPEG with C++ accessing a webcam带有 C++ 的 FFMPEG 访问网络摄像头
【发布时间】:2014-03-12 05:38:48
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 这很复杂,因为有许多不同类型的相机,而且还取决于您的平台。例如,在 Windows 上,ffmpeg 依赖 DirectShow 来访问视频输入设备。

标签: c++ ffmpeg libavcodec


【解决方案1】:

我已经为此工作了几个月。您的第一个“问题”是 ffmpeg(libavcodec 和其他 ffmpeg 库)不访问网络摄像头或任何其他设备。

对于基本的 USB 网络摄像头或音频/视频采集卡,您首先需要驱动程序软件才能访问该设备。对于 linux,这些驱动程序属于 Video4Linux(众所周知的 V4L2)类别,这些模块是大多数发行版的一部分。如果您使用的是 MS Windows,那么您需要获得一个允许您访问设备的 SDK。 MS 可能有一些可以访问通用设备的东西,(但根据我的经验,如果它们能正常工作,它们的能力不是很强)如果你已经做到了这一点,那么你现在有了原始帧(视频和/或音频)。

然后您将进入 ffmpeg 部分 - libavcodec - 它获取原始帧(音频和/或视频)并将它们编码为流,然后 ffmpeg 可以将其复用到您的最终容器中。

我搜索过,但发现所有这些的例子很少,而且大多数都是零碎的。

如果您不需要自己实际编写代码,命令行 ffmpeg 以及 vlc 可以访问这些设备,捕获并保存到文件,甚至流式传输。

这是我目前能做的最好的。

【讨论】:

    【解决方案2】:

    对于 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
    

    注意:必须包含头文件

    【讨论】:

    • 您能否添加一个适用于 Windows 的示例并写出哪些库是依赖项?我想使用 ffmpeg 库编写一个跨平台的解决方案。
    【解决方案3】:

    这确实不能回答问题,因为我没有适合您的纯 ffmpeg 解决方案,但是,我个人使用 Qt 进行网络摄像头访问。它是 C++ 并且将有一个更好的 API 来实现这一点。但是,它确实增加了对您的代码的很大依赖。

    【讨论】:

      【解决方案4】:

      这绝对取决于网络摄像头 - 例如,在工作中,我们使用通过网络传输 jpeg 数据流的 IP 摄像头。 USB 会有所不同。

      您可以查看 DirectShow 示例,例如 PlayCap(但它们也显示 AmCap 和 DVCap 示例)。一旦你有一个 directshow 输入设备(机会是你拥有的任何设备将在本机提供它)你可以通过dshow input device 将它连接到 ffmpeg。

      我花了 5 分钟浏览 ffmpeg 网站以获取这些链接,我看到了 this...

      【讨论】:

        猜你喜欢
        • 2010-11-18
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多