欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ffmpeg查看USB摄像头同时推流

程序员文章站 2022-03-04 23:25:10
...

欢迎访问自建博客原文:
http://www.e-lionel.com/index.php/2018/08/07/64/

最近有个项目,需求是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

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

相关标签: 流媒体