背景:最近因为项目需求研究一些关于使用ffmpeg推流,网上资料很少,有也大多数都是复制粘贴的,基本不适用我的项目,况且大部分对初学者非常不友好,所以将我的经验分享给大家。
环境:一台Windows服务器、一台开发PC(同一局域网内)
流媒体服务器:流媒体服务器有很多种,有付费的有免费开源的,我用的M7s,简单、小巧很不错推荐给大家(M7s官方地址:介绍 | Monibuca),我使用的是RTSP推流,默认地址是rtsp://127.0.0.1:554/live/test(需要将127.0.0.1替换你流媒体服务器IP地址,例如我的服务器IP地址是192.168.1.188)
一、ffmpeg使用
使用ffmpeg有很多方式,有安装配置环境变量的、有直接下载压缩包使用命令行的。
ffmpeg下载地址:Download FFmpeg
我用的是命令行,这里使用命令行教程:
首先下载ffmpeg压缩包解压文件,然后解压文件后找到文件,在当前文件夹的上面地址输入cmd回车即可,如何下载可自行搜索教程这里就不叙述了,下载后在所在目录上边目录地址输入cmd回车即可
*一定注意命令中的空格*
二、桌面推流
我只用到了两种桌面推流方式screen-capture-recorder和gdigrab
第一种、gdigrab :我最开始用的就是gdigrab桌面推流,不需要安装任何外部组件,简单推流命令:
ffmpeg -f gdigrab -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtsp rtsp://192.168.1.188:554/live/test
-
-f gdigrab
: 设置输入格式为gdigrab
,这是Windows平台上的GDI抓取器,用于捕获桌面图像。 -
-i desktop
: 指定输入源为桌面。gdigrab
会自动选择整个桌面或指定的窗口进行捕获。 -
-vcodec libx264
: 设置视频编码器为libx264
,即H.264编码器。 -
-preset:v ultrafast
: 设置编码预设(preset)为ultrafast
,这会导致更快的编码速度,但可能会牺牲一些压缩率。 -
-tune:v zerolatency
: 设置编码调优(tune)为zerolatency
,这有助于减少延迟,适用于实时流媒体场景。 -
-f rtsp
: 设置输出格式为RTSP。 -
rtsp://192.168.1.188:554/live/test
: 指定RTSP输出URL,将视频流传输到指定的服务器地址和端口。
其他参数可自行添加
但是我用gdigrab发现一个问题,就是推流的时候屏幕肉眼可见的闪烁,尤其看鼠标更加明显,换了很多台电脑也没能解决问题,上网搜索也找不到解决办法,如果有知道的麻烦告知一下,困扰我很长时间了。
第二种、screen-capture-recorder,我目前就是用的这种获取屏幕截图方式,screen-capture-recorder属于外部组件必须先安装screen-capture-recorder,我最开始在网上找推流有很多博主写了这种方式但是都没告诉需要安装screen-capture-recorder导致我推流总是失败。
首先需要去GitHub上下载screen-capture-recorder安装包或使用其他方式,我是用的安装包直接安装,下载地址:
Releases · rdp/screen-capture-recorder-to-video-windows-free · GitHub
下载后双击打开安装,下一步、下一步...
安装完成后和上面gdigrab步骤一样在所在目录输入cmd,推流命令:
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -preset:v ultrafast -pix_fmt yuv420p -acodec aac -f rtsp rtsp://192.168.1.188:554/live/test
-
-f dshow
: 指定输入格式为DirectShow(Windows平台上的多媒体框架)。 -
-i video="screen-capture-recorder"
: 指定视频输入源为名为"screen-capture-recorder"的屏幕捕捉记录器。 -
-f dshow
: 再次指定输入格式为DirectShow,这次是为了音频输入。 -
-i audio="virtual-audio-capturer"
: 指定音频输入源为名为"virtual-audio-capturer"的虚拟音频捕获器。 -
-vcodec libx264
: 指定视频编码器为libx264(H.264编码标准)。 -
-preset:v ultrafast
: 设置视频编码器的预设模式为"ultrafast",以优先考虑速度而非压缩率。 -
-pix_fmt yuv420p
: 设置输出视频的像素格式为yuv420p,这是一种较为通用的格式,适用于大多数播放器和设备。 -
-acodec aac
: 指定音频编码器为AAC(Advanced Audio Coding)。 -
-f rtsp
: 指定输出格式为实时传输协议(RTSP)。 -
rtsp://192.168.1.188:554/live/test
: 指定RTSP流的输出地址和端口,这里是发送到IP地址为192.168.1.188的服务器,端口号为554,路径为/live/test。
这个添加了桌面音频获取,参数可以根据自己实际情况修改。
三、摄像头推流(USB摄像头)
ffmpeg -f dshow -i video="摄像头名称" -vcodec libx264 -preset:v ultrafast -pix_fmt yuv420p -f rtsp rtsp://192.168.1.188:554/live/test
摄像头名称需要自己配置,可使用下列命令查询设备所有摄像头名称
ffmpeg -list_devices true -f dshow -i dummy
以上就是我总结的一些经验,欢迎评论交流
PS:****编辑器太难用了,我只能尽我的努力重点部分用颜色标记