芒果爱吃胡萝卜 - 音频
type: channel
link: http://blog.mangolovecarrot.net/tag/%E9%9F%B3%E9%A2%91/
items: 树莓派利用ffmpeg将外接USB麦克风的音频实时推流到rtmp服务器，实现在任意设备上实时监听音频

树莓派利用ffmpeg将外接USB麦克风的音频实时推流到rtmp服务器，实现在任意设备上实时监听音频
type: item
date: 2021-11-07T21:10:00+08:00
description: 系统组成概要其实串流服务器也可以安装在树莓派上，但由于树莓派系统目前只有32位的所以对docker的兼容性很有问题，很多docker的镜像都只支持此64位系统。再就是笔者的树莓派是古老的1代，性能有限，跑一个ffmpeg解码推流就已经占用大部分cpu资源了。所以这里将串流服务安装在另一台ubunbu上 (2023年更新了安装在树莓派4b上的教程，请切换tab阅读)。1. 安装服务端1-1 安装docker在ubuntu上安装docker请参见这篇文章。[post cid="247" cover=""/]1-2 开放服务端口需要开放两个端口，一个是用来监听推流数据的端口1935，一个是用于实时播放用的网页播放器的http服务端口33380。在ubuntu上开放端口的方法请参见这篇文章。[post cid="249" cover=""/]1-3 用docker安装流媒体服务（nginx+rtmp）[scode type="green"]这部分请切换Tab阅读，支持x86架构的ubuntu或者arm64架构的树莓派。[/scode][tabs][tab name="1-3-A-安装在 x86架构服务器上 （比如 ubuntu 18.04 or 20.04 or 22.04）" active="true"]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[/tab][tab name="1-3-B-安装在 arm64架构服务器上 （比如 ubuntu for arm64 on 树莓派4b）" active="false"]下面将用到博主自己制作的适配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[/tab][/tabs]2. 客户端 (树莓派)2-1 系统更新sudo apt-get update sudo apt-get upgrade2-2 安装ffmpegsudo apt-get install ffmpeg2-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 #02-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那么不需要特别注明端口号，因为这个是rtm…