乐趣区

基于ffmpeg+nginx+UscreenCapture的局域网直播系统搭建

本文的创作灵感是由 Windows screen recording with FFmpeg UScreenCapture and NGINX RTMP module 而来,笔者建议大家可以先去原文看一下大致的内容,但需要一定的英文阅读能力,本文并不是照搬翻译,而是根据原文成功搭建直播系统的基础上增加了服务器录制和本地录制的内容:
系统环境:
Windows 7 Service Pack 1 64bit
软件准备:
ffmpeg:这里笔者使用原文的地址下载了官方打包好的可执行文件
nginx:这里笔者使用原文的地址下载了编译好 nginx rtmp module 的打包文件
UScreenCapture(x64):请参看原文下载地址
QtAv:笔者在二次开发时选择的库(可选)
vlc-qt:基于 vlc 的库(可选), 笔者一开始做本地录制功能的时候选择了这个库,但是在尝试本地播放视频同时录制的时候,发现开始录制后没有停止录制的接口,于是就放弃了
libvlc:vlc 官方的开源组件,可供其他开发平台调用(可选),上面的 vlc-qt 是基于 Qt 开发环境的,如果不依赖 Qt 可以尝试用这个库,不过需要看一下官方的开发文档,笔者并没有相关开发经验,就不做过多介绍了
产品需求:
将某台 PC 的桌面作为视频直播源,推送至直播服务器,可供局域网内的其他 PC 通过视频播放器观看,观看直播的同时可以随时开始 / 停止录制当前的播放内容
开发步骤:
安装 UScreenCapture(x64),后续作为可用视频输入源供 ffmpeg 使用
点击下载好的 nginx 目录中的 nginx.exe,启动 nginx 服务器,根据 conf 文件夹中的 nginx.conf 配置,此时服务器会监听 81-web 端口和 1935-rtmp 端口
打开命令提示符(cmd),输入以下命令,此命令用于确认是否正确安装并 ffmpeg 可以识别 UscreenCapture 作为视频流输入源:
[这里是 ffmpeg 文件夹的绝对路径]/ffmpeg.exe -list_devices true -f dshow -i dummy

[这里是 ffmpeg 文件夹的绝对路径]/ffmpeg -f dshow -i video=”UScreenCapture” -preset ultrafast -f flv rtmp://127.0.0.1/view/test
上述代码的作用就是,以 UScreenCapture 作为输入源,编码速率设定为 ultrafast,编码格式为 flv,将视频媒体流推送到 rtmp://127.0.0.1/view/test 这个地址上
当然,其中输入源可以选择摄像头,本地视频文件等;编码速率,格式以及推送地址都可以根据需要进行配置,最终的目的都是为了把本地源推送至服务器以供远程播放器使用
测试直播是否正常可以使用 ffmpeg 文件夹中的 ffplay rtmp://127.0.0.1/view/test, 也可以使用其他播放器,如 vlc player
如果需要录制视频功能,可以选择以下两种方案,录制后的文件各自保存的位置不同

播放端录制使用 QtAv 的 VideoDecoder+VideoEncoder+AVMuxer+AVDemuxer, 将播放源进行编解码后保存到本地,因为官方没有正式的例子,下文的代码仅供演示使用(代码整理中,后续尽快添加)
To Be Continued。。。

服务器端录制 利用 nginx rtmp module 的 rtmp_control 功能,通过 HTTP 协议在服务器端进行开始录制及停止录制操作,nginx 端的配置见下文

server {
……
location /control {
rtmp_control all;
}
}

rtmp {
server {
listen 1935;
application view {下面的录制命令 app 参数会用到这个配置名
live on;
recorder NAME_THIS_WHAT_YOU_WANT {# 下面的录制命令 rec 参数会用到这个配置名
record all manual;
record_suffix -%Y-%m-%d-%H%M.mp4;
record_path C:\\nginx\\recordings;
record_unique on;
}
}
}
}

rtmp://127.0.0.1/view/test,其中 view 是服务器配置的 rtmp 服务名,test 是自定义的视频流名称
启动录制:http://localhost:81/control/record/start?app=view&name= 自定义的视频流名称 &rec=NAME_THIS_WHAT_YOU_WANT
停止录制:http://localhost:81/control/record/stop?app=view&name= 自定义的视频流名称 &rec=NAME_THIS_WHAT_YOU_WANT

退出移动版