ffmpeg查看USB摄像头同时推流
欢迎访问自建博客原文:
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
综上,基本算是变相实现了本次的需求,希望这个帖子对大家有帮助。
推荐阅读
-
Android 音视频深入 十六 FFmpeg 推流手机摄像头,实现直播 (附源码下载)
-
FFMPEG对摄像头进行RTP推流,以及RTP转发服务
-
ffmpeg实现屏幕录制、摄像头录制、录音和RTMP推流
-
关于FFMPEG采集摄像头推流方法说明
-
ffmpeg 读取摄像头并通过rtmp推流同时在本地显示(新版ffmpeg接口+SDL2)
-
Android 音视频深入 十六 FFmpeg 推流手机摄像头,实现直播 (附源码下载)
-
【RTMP推流】利用FFMPEG进行USB摄像头数据采集硬件编码后进行 RTMP推流
-
linux FFMPEG 摄像头采集数据推流
-
摄像头 使用ffmpeg推流实现整理记录
-
ffmpeg本地图片(摄像头)推rtmp流