最近项目上自研了一个直播服务,让全国各地的人能通过客户端实时观看视频。技术原理和完成步骤简单分享在这里。
简单来讲,要完成这样一个直播服务,基本架构如下:
- 摄像头:用于采集视频信号。普通的 USB 摄像头即可。
- 树莓派:用于将视频信号转换成 rtmp 协议的推流,推送到阿里云直播中心。
- 阿里云直播中心:接收推流信号,并进行存储、转码、分发等。
- WEB 客户端:从阿里云直播中心拉取直播流,并播放。
上述每个环节都可以找到开源软件实现基本功能,但相对来说,直播中心的实际复杂度会远远高于其他模块。因此,直接采用 阿里云的直播服务 来承载最复杂的直播中心功能。
配置阿里云直播中心
首先,打开阿里云控制台,开通视频直播服务,然后按要求配置域名和 CDN,接着生成直播推流地址和播放地址。
开通视频直播需要实名认证和域名备案,这一步要耐心完成
记下 推流地址,接下来要把这个地址配置到树莓派,让树莓派读取摄像头推送直播信号
配置树莓派
这一步要确保树莓派上安装了 ffmpeg 软件。如果没有装,执行 sudo apt install ffmpeg 即可。
首先,取一个 USB 摄像头,插到树莓派上,然后执行 ls /dev,可以发现多了一个 /dev/video0 的视频设备,这是 USB 摄像头的设备文件。
然后,执行 ffmpeg 转码命令:
ffmpeg -i ‘/dev/video0’ -vcodec libx264 -f flv -an ‘rtmp://${PUSH_URL}’
- -i ‘/dev/video0’ 从 /dev/video0 设备读取视频流
- -vcodec libx264 编码成 h246 格式(这个参数非常重要,因为 web 客户端只支持 h264 编码)
- -f flv 视频流封装成 flv 格式
- -an 去除音频流(不需要)
- rtmp://${PUSH_URL} 直播信号推流地址,${PUSH_URL} 替换成上一节“配置阿里云直播中心”生成的推流地址
可以看到 FFmpeg 正常编码推送:
htop 一下观察 FFmpeg 资源消耗,可以发现 h264 编码还是比较耗 CPU 的。但其实只要重新编译 FFmpeg,加入树莓派硬件 h264 编码器 h264_omx 即可解决。
如果 USB 摄像头带麦克风,也可以音视频合成后推流,用 ffmpeg -i /dev/video0 -f alsa -i default:CARD=${AID} -ab 16 -ar 22050 -ac 1 -f mp3 -f flv ‘rtmp://${PUSH_URL}’ 指令实现(arecord -L 获取音频设备 AID)。但这个指令解决不了音视频同步的问题,慎用。
播放
打开 树莓派直播测试页面,填入阿里云直播中心给出的 flv 播放地址,点击确定,就能看到 USB 摄像头传来的实时画面了。
有能力的话,也可以用 B 站的 H5 flv 播放器 bilibili/flv.js: HTML5 FLV Player 搭一个自己的 web 播放客户端。