系统组成概要

请输入图片描述

其实串流服务器也可以安装在树莓派上,但由于树莓派系统目前只有32位的所以对docker的兼容性很有问题,很多docker的镜像都只支持此64位系统。再就是笔者的树莓派是古老的1代,性能有限,跑一个ffmpeg解码推流就已经占用大部分cpu资源了。所以这里将串流服务安装在另一台ubunbu上 (2023年更新了安装在树莓派4b上的教程,请切换tab阅读)。

1. 安装服务端

1-1 安装docker

在ubuntu上安装docker请参见这篇文章。

1-2 开放服务端口

需要开放两个端口,一个是用来监听推流数据的端口1935,一个是用于实时播放用的网页播放器的http服务端口33380。

在ubuntu上开放端口的方法请参见这篇文章。

1-3 用docker安装流媒体服务(nginx+rtmp)

这部分请切换Tab阅读,支持x86架构的ubuntu或者arm64架构的树莓派。

docker pull alfg/nginx-rtmp
docker run -it -p 1935:1935 -p 33380:80 --rm alfg/nginx-rtmp

说明,容器内的两个端口分别被映射到宿主机的1935和33380(这两个宿主机的端口都可以换成自己喜欢的任意端口,只要和宿主机其他服务不冲突即可),也就是上面开放的两个端口。

上面的命令是启动了一个随用随删的一次性容器,在退出会话后会被自动删除。如果想一直保持后台运行可以换成以下命令,对docker的容器机制不熟悉的还是推荐使用上面的一次性容器比较好。

docker run -d --name nginx-rtmp -p 1935:1935 -p 33380:80 alfg/nginx-rtmp

下面将用到博主自己制作的适配arm64系统的docker镜像。已经发布在docker hub上。

docker pull slipperstree/arm64-nginx-rtmp
docker run -it -p 1935:1935 -p 33380:80 --rm slipperstree/arm64-nginx-rtmp

说明,容器内的两个端口分别被映射到宿主机的1935和33380(这两个宿主机的端口都可以换成自己喜欢的任意端口,只要和宿主机其他服务不冲突即可),也就是上面开放的两个端口。

上面的命令是启动了一个随用随删的一次性容器,在退出会话后会被自动删除。如果想一直保持后台运行可以换成以下命令,对docker的容器机制不熟悉的还是推荐使用上面的一次性容器比较好。

docker run -d --name nginx-rtmp -p 1935:1935 -p 33380:80 slipperstree/arm64-nginx-rtmp

2. 客户端 (树莓派)

2-1 系统更新

sudo apt-get update
sudo apt-get upgrade

2-2 安装ffmpeg

sudo apt-get install ffmpeg

2-3 插入USB麦克风并查看USB录音设备号码

arecord -l

运行结果大概是这样的,记住card后面的数字和device后面的数字。本例中是1和0。后面会用到。

**** List of CAPTURE Hardware Devices ****
card 1: Microphone [Yeti Stereo Microphone], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

2-4 运行ffmpeg推送音频流到串流服务器

ffmpeg -f alsa -ac 1 -i hw:1,0 -ar 11025 -f flv rtmp://[your-rtmpserver.com]/stream/hello

说明,hw参数后面的1,0就是上一步记下的两个号码card和device,注意顺序,card在前。

将[your-rtmpserver.com]换成ubuntu服务器的ip地址或者绑定的域名。如果使用了端口1935那么不需要特别注明端口号,因为这个是rtmp协议的默认端口号。如果你换成了别的端口号比如1999那么需要在域名或ip后指定端口号。比如your-rtmpserver.com:1999。

这样执行的效果是立即开始启动录音并实时推送到串流服务器上,直到你按下Ctrl+C强制退出。

如果想在后台一直运行可以使用screen工具在一个独立的screen进程中执行。

3. 万事俱备,播放串流音频

使用串流服务器提供的简易网页播放器

在浏览器中打开下面的网址即可开始播放。(PC,手机均可)
注意,由于arm版本的镜像制作方法和x86的略有不同,arm镜像暂不支持在网页播放流媒体的方法。

http://[your-rtmpserver.com]:33380/player.html?url=http://[your-rtmpserver.com]:33380/live/hello.m3u8

端口号就是一开始随便设置的那个端口号。

注意,本文里的hello这个id/路径可以随意修改,推送时推什么id那么播放时就用什么id,为安全起见可以用一长串复杂的字符串防止别人偷看/偷听。(但如果不用hello那么播放时就只能使用rtmp协议播放,因为hello这个路径在nginx的配置文件中默认写死了,如果有兴趣可以自己修改容器内nginx的配置文件来适配别的id)

使用音视频播放软件

x86版服务器:
以Mac上的VLC播放器为例,「媒体-打开网络串流」输入流媒体地址稍等片刻缓冲好了即可播放。
流媒体地址: http://[your-rtmpserver.com]:33380/live/hello.m3u8
image.png

arm64版服务器:
以Win11上的VLC播放器为例,「媒体-打开网络串流」输入流媒体地址稍等片刻缓冲好了即可播放。
流媒体地址: rtmp://[your-rtmpserver.com]/stream/hello
VLC播放器

注意arm版本使用的流媒体地址是rtmp协议的,暂不支持http协议的m3u8格式。

Last modification:September 28, 2023
If you think my article is useful to you, please feel free to appreciate