1、最近在做一个直播录播项目,使用USB摄像头、网络摄像头转rtmp推流到阿里云,需要用C++封装底层接口给上层使用,客户要求接入两个摄像头和两个麦克风,发现不同型号带内置麦克风摄像头是可以同时显示的,但是两个同型号的USB摄像头连接电脑获取的摄像头友好名称是一样的,ffmpeg打开摄像头有两种方式,VFWCAP和DSHOW,VFWCAP可能已经过时,插入两个摄像头 VFWCAP只有一个设备ID是0,直接放弃,使用通过dshow方式,使用友好名称只能打开一个,网上查找相关资料很少,仅此记录下。
最后参考官方文档,http://ffmpeg.org/ffmpeg-all.html#Options-58 可以用设备的alternative name(这个也可能带中文,我使用的的麦克风就是中文的)
2、使用Windows API获取的alternative name与FFMPEG 通过命令获取的名称不一样,前者带冒号后者是下划线,需要将冒号替换成下划线,ffmpeg 接口才可以识别,ffmpegapi 传入的名称是编码UTF-8,网上关于转换编码基本都没法正常打开,最后参照FFmpeg源码中的转换函数才可以。
编码转换函数如下
static char *dup_wchar_to_utf8(wchar_t *w)
{
char *s = NULL;
int l = WideCharToMultiByte(CP_UTF8, 0, w, -1, 0, 0, 0, 0);
s = (char*)av_malloc(l);
if (s)
WideCharToMultiByte(CP_UTF8, 0, w, -1, s, l, 0, 0);
return s;
}
以上通过 命令列出 ffmpeg -list_devices true -f dshow -idummy
VFWCAP 就显示一个设备ID,直接放弃使用上面DSHOW方式。
以上通过命令列出 ,插入两个摄像头 只列出一个来,可能vfwcap比较过时了, ffmpeg -f vfwcap -i list
Windows DirectShow input device.
DirectShow support is enabled when FFmpeg is built with the mingw-w64 project. Currently only audio and video devices are supported.
Multiple devices may be opened as separate inputs, but they may also be opened on the same input, which should improve synchronism between them.
The input name should be in the format:
TYPE=NAME[:TYPE=NAME]
where TYPE can be either audio or video, and NAME is the device’s name or alternative name..