【发布时间】:2014-03-12 05:38:48
【问题描述】:
我四处搜索,找不到任何关于如何在 C++ 中使用 ffmpeg 访问网络摄像头的示例或教程。任何示例代码或任何指向我一些文档的帮助,将不胜感激。
提前致谢。
【问题讨论】:
-
这很复杂,因为有许多不同类型的相机,而且还取决于您的平台。例如,在 Windows 上,ffmpeg 依赖 DirectShow 来访问视频输入设备。
标签: c++ ffmpeg libavcodec
我四处搜索,找不到任何关于如何在 C++ 中使用 ffmpeg 访问网络摄像头的示例或教程。任何示例代码或任何指向我一些文档的帮助,将不胜感激。
提前致谢。
【问题讨论】:
标签: c++ ffmpeg libavcodec
我已经为此工作了几个月。您的第一个“问题”是 ffmpeg(libavcodec 和其他 ffmpeg 库)不访问网络摄像头或任何其他设备。
对于基本的 USB 网络摄像头或音频/视频采集卡,您首先需要驱动程序软件才能访问该设备。对于 linux,这些驱动程序属于 Video4Linux(众所周知的 V4L2)类别,这些模块是大多数发行版的一部分。如果您使用的是 MS Windows,那么您需要获得一个允许您访问设备的 SDK。 MS 可能有一些可以访问通用设备的东西,(但根据我的经验,如果它们能正常工作,它们的能力不是很强)如果你已经做到了这一点,那么你现在有了原始帧(视频和/或音频)。
然后您将进入 ffmpeg 部分 - libavcodec - 它获取原始帧(音频和/或视频)并将它们编码为流,然后 ffmpeg 可以将其复用到您的最终容器中。
我搜索过,但发现所有这些的例子很少,而且大多数都是零碎的。
如果您不需要自己实际编写代码,命令行 ffmpeg 以及 vlc 可以访问这些设备,捕获并保存到文件,甚至流式传输。
这是我目前能做的最好的。
肯
【讨论】:
对于 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
注意:必须包含头文件
【讨论】:
这确实不能回答问题,因为我没有适合您的纯 ffmpeg 解决方案,但是,我个人使用 Qt 进行网络摄像头访问。它是 C++ 并且将有一个更好的 API 来实现这一点。但是,它确实增加了对您的代码的很大依赖。
【讨论】:
这绝对取决于网络摄像头 - 例如,在工作中,我们使用通过网络传输 jpeg 数据流的 IP 摄像头。 USB 会有所不同。
您可以查看 DirectShow 示例,例如 PlayCap(但它们也显示 AmCap 和 DVCap 示例)。一旦你有一个 directshow 输入设备(机会是你拥有的任何设备将在本机提供它)你可以通过dshow input device 将它连接到 ffmpeg。
我花了 5 分钟浏览 ffmpeg 网站以获取这些链接,我看到了 this...
【讨论】: