ffmpeg查看USB摄像头同时推流

最近有个项目,需求是USB摄像头在观看画面的同时做直播,一直以来都是通过ffmpeg+nginx的方式来做,但是本次遇到了一个大坑。


查看本地设备列表

ffmpeg -list_devices true -f dshow -i dummy

可以看见本地有两个摄像头可以用
分别是:
Integrated Camera
Gsou Audio Webcam
这里用Gsou Audio Webcam做测试。

ffplay观看摄像头画面

ffplay -f dshow -i video="Gsou Audio Webcam"

ffmpeg推USB摄像头

 -vcodec libx264 -an -f flv "rtmp://192.168.63.71:10035/live/test1"

将摄像头的视频保存到本地

ffmpeg -f dshow -i video="Gsou Audio Webcam" -vcodec libx264 -an -c copy -f avi "C:\Users\Lionel\Desktop\copytest\test1.avi"

三个shell分别执行都没有什么问题,但是当同时运行的时候就出现了问题
提示摄像头I/O被其他设备占用。
这样问题就来了,我的需求是看的同时推流并保存。而且要求本地看到的摄像头画面需要没有延迟(rtmp流大概有3s左右的延迟)。
所以我考虑了以下思路:
1、使用虚拟摄像头
通过VCam等虚拟摄像头软件将摄像头虚拟化,让多方都同时使用这个虚拟摄像头。
思路是OK的,但是在使用的过程中发现虚拟摄像头的效果都不是很理想,所以这个思路被我PASS了。
2、本地播放摄像头,全屏播放,然后实用ffmpeg将本地桌面推流出去,达到直播的效果。
这个思路我觉得也是OK的,于是进行了尝试。
网络上收集了一些资料,说ffmpeg推流本地桌面需要其他插件支持,于是进行了尝试,也就是上边设备列表里出现的“screen-capture-recorder”。但实际上并没有成功,或许也是我操作方法不正确。
于是继续搜寻资料,终于在chinaFFmpeg的论坛看到了另一种方式。

ffmpeg推流本地桌面

ffmpeg -draw_mouse 1 -offset_x 0 -offset_y 0 -f GDIgrab -i desktop -f flv rtmp://192.168.63.71:10035/live/test1

尝试发现这种方式是OK的,可以时间本地桌面的推流。但是如果多现实做的扩展显示,则会将所有桌面图像并列推出去,目测“-offset_x 0 -offset_y 0”参数可以解决这个问题,但是我只是把屏幕扩展关掉了,实验是好用的。
这样我们就获得了rtmp流,可以观看和进行录像,具体的shell命令可以在我其他帖子里看到。
测试播放可以使用VLC,但是使用发现这个软件播放会加大延迟。
也可以使用ffplay播放。
也可以使用EASYDSS提供的在线播放器,我通常是使用这个测试,因为比较方便嘛。
地址:http://www.easydss.com:10088/#/player

综上,基本算是变相实现了本次的需求,希望这个帖子对大家有帮助。

发表评论

电子邮件地址不会被公开。 必填项已用*标注