用树莓派搭建自己的FM电台并进行直播

进行操作前首先请先备份树莓派数据,防止操作过程中出现的问题导致数据丢失!
连接杜邦线的长度不宜过长,防止发射范围超过法律规定,切勿违犯无线电管理条例!
操作过程中会设置force_turbo=1强制超频将使得树莓派官方保修失效!请考虑好再进行操作。

《中华人民共和国无线电管理条例》

早就听说过树莓派能够发射广播信号,奈何当时没有树莓派,无法进行尝试。

现在有了一个树莓派3B,可以玩了~

接下来教你如何用树莓派搭建一个自己的FM电台并发射直播信号进行直播

所需要的材料:电脑一台、树莓派(看适配列表)一个,杜邦线一条(选配,也可以用铜线、铜丝代替),收音机一台(或者有FM收音功能的设备,比如手机,对讲机,电台)

主要用到的软件:rpitx。它可以让树莓派发射5 KHz到1500 MHz之间的广播信号。

https://github.com/F5OEO/rpitx

除此之外你还可以用

https://github.com/ChristopheJacquet/PiFmRds

https://github.com/markondej/fm_transmitter

适配列表

树莓派型号 状态
Pizero OK
PizeroW OK
PiA+ OK
PiB 部分
PiB+ OK
P2B OK
Pi3B OK
Pi3B+ OK
Pi4 测试

注:切勿在没有带通滤波器的情况下使用天线传输

img

安装rpitx

实测在Raspberry Pi OS 64位版本上安装成功并能正常运行。

  1. 先更新树莓派上的软件包:sudo apt update
  2. 之后安装Git: sudo apt install git

注:rpitx软件源在Github,国内直接访问可能有些许困难,安装过程也需要一直连接Github安装依赖。因此安装好Git后建议提前给树莓派上的Git配置好代理,可以保证之后的安装比较顺利。搜索关键字:Git 配置代理

  1. cd到合适的位置(有权限的位置),拉取rpitx在Github的代码:

    1
    git clone https://github.com/F5OEO/rpitx
  2. 进入rpitx文件夹:cd rpitx

  3. 安装rpitx:./install.sh

之后就是漫长的安装过程了,中间会有一些报错,但是只要安装没有停下来就问题不大。

在安装最后,会提示是否允许修改 /boot/config.txt,这一步要求我们将GPU的频率锁定在250Mhz,并设置 force_turbo=1强制超频。 注意!设置 force_turbo=1强制超频将使得树莓派保修失效。 输入y并回车,之后重启树莓派即可。(不要修改 config.txt文件)

rpitx测试

现在让我们测试一下是否正确安装了rpitx。如果你的树莓派有金属保护壳的话,将保护壳拿下来,把树莓派暴露出来,否则收音机收不到足够的信号。

  1. 先进入rpitx目录:cd rpitx
  2. 然后输入rpitx自带的测试命令:./easytest.sh
  3. 输入命令之后窗口会变成蓝色,首先需要输入发射的频率,我国FM收音机的能接受的频率在87.5~108之间,输入一个这段频率之间的、你本地没有其他电台占用的频率,回车即可。
    选择频率
  4. 之后就进入选择发射方式的菜单了,按方向键选择“FmRds”的选项,按回车键确认。
    选择发射方式
  5. 屏幕上就会显示出下面的界面,拿出收音机,调到刚刚输入的频率,试着听一下,是不是有一段男声播报”Pi FmFds”的测试语音啦?按空格键可以返回上层菜单,再按ESC键退出测试。
    正在发射

如果只持续了几秒,信号就断了,可以执行

1
sudo rmmod w1-gpio

但是这样发射的范围特别近,收音机离开树莓派一两米就没有信号了。这时候就可以拿出杜邦线,插在树莓派的GPIO 4引脚(图中7号引脚)实测加一段十几厘米的线能将发射范围拓展到两三间屋子,加到半米左右能覆盖大半层宿舍楼。但是要注意,范围不要太大,否则可能就违反无线电相关的法律条例了。

树莓派引脚

使用rpitx播放音乐

rpitx支持直接播放WAV格式的音频,命令如下:

1
sudo ./pifmrds -freq [frequency] -audio [filename.wav]   

比如你要在88.0MHZ进行发射,播放根目录下的music.wav文件,就可以输入命令:

1
sudo ./pifmrds -freq 88.0 -audio /music.wav   

但是如果音乐的格式是MP3格式或者是其他格式呢?当然是可以事先转换成WAV格式的音频的,但这样太麻烦了。这时候就可以请出音频处理的瑞士军刀——sox了。

先安装sox,直接从包管理器中安装就可以:sudo apt install sox libsox-fmt-all

安装完成后就可以使用如下的命令来实时转换MP3文件到WAV文件进行播放了,其中的”-“就是大名鼎鼎的Linux管道符了:

1
sox -t [format] [filename] -t wav - | sudo ./pifmrds -freq XX -audio -   

比如你要在88.0MHZ进行发射,播放根目录下的music.mp3文件,就可以输入命令:

1
sox -t mp3 /music.mp3 -t wav - | sudo ./pifmrds -freq 88.0 -audio /music.wav   

播放的MP3文件不一定是本地的,网络上的MP3文件或者MP3的直播源(流)也是可以的,比如可以用sox+rpitx的组合发射法广或俄罗斯卫星广播电台的直播节目:

1
sox -t mp3 https://rfienchinois64k.ice.infomaniak.ch/rfienchinois-64.mp3 -t wav - | sudo ./pifmrds -freq 80 -audio -sox -t mp3 http://icecast-ruvr.cdnvideo.ru/rian.voicechi -t wav - | sudo ./pifmrds -freq 80 -audio -   

使用rpitx播放网络串流

上面简单提到了如何使用sox配合rpitx来发射MP3,并且可以直播发射一小部分格式为MP3音频流的直播串流。但是很多串流是M3U8格式的,并不是MP3音频流。这个时候可以请出来Linux上(Windows上也是啊Kora)的播放神器——VLC。

下面的步骤最好是先为树莓派设置VNC连接或Xrdp远程桌面连接,连接到树莓派的图形化界面上,操作会更加方便些。这里推荐这篇文章,可以作为参考:如何在 Raspberry Pi 上安装 Xrdp Server (远程桌面) - 树莓派俱乐部

  1. 使用VNC或远程桌面连接到树莓派。
  2. 先安装VLC,可以用apt命令行安装,也可以用图形化界面下的包管理器进行安装。
  3. 打开VLC,选择媒体菜单中的“流”并进入“打开媒体”对话框。
    VLC
  4. 选择“网络”选项卡,在输入框中输入M3U8源地址,之后点击“串流”按钮,弹出“流输出”对话框。弹出的新对话框中,第一个“下一个”按钮直接点击即可。
  5. 在此之后的菜单中选择”HTTP”这一选项,点击”添加”按钮。之后的端口号和路径可以不进行修改(当然端口号如果被占用了当然要进行修改,下面的命令中也要同步修改),直接下一步即可。
    流输出对话框
  6. 之后保持默认设置,配置文件为”Audio - MP3”,直接下一步,然后再点击”流”按钮,VLC这一部分就完成了。
    流输出对话框2
  7. 再使用sox+rpitx的组合拳,把串流直播出来:
1
sox -t mp3 http://127.0.0.1:8080/ -t wav - | sudo ./pifmrds -freq 80 -audio -   

直播成功

(上图中我换了一个端口号,因为8080被占用了.)现在打开收音机,听一听,是不是能听到清晰的直播节目了?

采集树莓派系统声音 并使用rpitx实时发射

下面将会简单介绍,如何采集树莓派系统声音,并使用rpitx实时发射。不管是在树莓派中打开音乐播放器播放的音乐,还是打开视频播放器播放视频的声音,还是浏览网页上网页的声音,都可以被实时采集并通过rpitx发射出去。

  1. 先查看一下可以捕捉的声卡,使用命令:pacmd list | grep ".monitor"。如果命令行返回的是”没有 PulseAudio 守护进程在运行,或者没有作为会话守护进程运行“或者是相同含义的英语,那么就先执行一下 pulseaudio --start &,启动一下PulseAudio 守护进程,再重新执行这条命令。正常返回的截图如下,将画红线部分的monitor name复制下来备用,不同系统版本的树莓派可能会有一些差异:
    获取monitor name
  2. 进入rpitx文件夹,输入命令:
1
pacat --record -d [monitor_name] | sox -t raw -b 16 -c 2 -v 1 -r 44100 -L -e signed-integer - -t wav - | sudo ./pifmrds -freq [frequency] -audio -   

简单解释一下这一句长长的命令:其中,[monitor_name]就是第一步中我们得到的 monitor name[frequency]是你想要发射的频率。sox命令后所跟的参数,-b代表采样的比特位数,-c代表声道的个数,-v代表转换音量的大小,-r代表采样率的多少。前面的-t代表是从raw格式进行转换,后面的-t代表转换成wav格式。当时研究出这条命令,花费了我足足半天的时间呢……

本文的标题里面还有一句“并进行直播”,这一部分就是对直播的简单实践。当然要直播自己的声音,或者直播其他设备上的声音,理论上也是可行的。有两种方案:

  1. 购买一个USB声卡,安装好USB声卡的驱动后,连接好麦克风或者AUX输入,再从树莓派端进行采集和捕获。(推荐)
  2. 建立一个局域网内的直播服务器,使用其他设备进行收音并推流刀直播服务器,从树莓派上拉流进行直播。

模拟输入 采集其他设备的音频输出进行发射

  1. 先查询一下当前系统中的声音输入设备:pacmd list | grep "input" 可以看到,有一个名叫 alsa_input.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-00.mono-fallback的设备。复制设备的设备名称备用。
    input
  2. cd到rpitx的目录,执行上面提到的输出命令:
1
pacat --record -d alsa_input.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-00.mono-fallback | sox -t raw -b 16 -c 2 -v 1 -r 44100 -L -e signed-integer - -t wav - | sudo ./pifmrds -freq 100.3 -audio -   

打开收音机,调整到正确的频率上,是不是能听到输出设备中的声音啦?部分输出设备的音量要调大一些才能取得不错的效果。另外根据声卡的好坏,会有些许延迟,这是正常情况。到此,用树莓派搭建自己的FM电台并进行直播这一终极目标终于实现,我们可以利用树莓派发射自己喜欢的节目咯。

利用蓝牙 将其他设备的声音传送到树莓派上发射

要想让其他设备能连接上树莓派,并且将音频信号传送给树莓派,首先得让其他设备认为树莓派是音频设备(比如蓝牙耳机),这样才能将音频输出切换到树莓派上,并自然的传送音频信号给树莓派进行发射了。实测可以将Android、IOS和Linux设备上的声音通过蓝牙传送到树莓派上,而Windows则提示“耳机已拔出”,一直没能成功。

  1. 在树莓派上运行命令 sudo hciconfig hci0 up 打开树莓派的蓝牙。
  2. 执行命令 sudo hciconfig hci0 class 0x200420 这一步是将树莓派的蓝牙属性改为“音频设备”,这样就能让其他设备将树莓派识别成音频设备,乖乖的把音频流往树莓派上传送了。
  3. 执行命令 hciconfig -a,看看树莓派的蓝牙属性是否成功被修改了。没有成功的话,反复开关蓝牙,多尝试几次。正常的显示如下图:
    树莓派显示
  4. 进入树莓派桌面环境,蓝牙菜单在桌面右上角,开启树莓派和其他设备的蓝牙可发现,将树莓派和其他设备进行配对与连接。
  5. 连接成功,其他设备就能向树莓派传送音频啦!如下图。这时,在其他设备上随便播放一段音乐或者视频。
    音频输出
  6. 查询一下当前树莓派中的声音输入设备:pacmd list | grep "a2dp_source" 可以看到,有一个名叫 bluez_source.XX_XX_XX_XX_XX_XX.a2dp_source的设备,具体名称跟其他设备的蓝牙MAC地址有关。复制设备的设备名称备用。
    树莓派显示
  7. cd到rpitx的目录,执行上面提到的输出命令:
1
pacat --record -d abluez_source.XX_XX_XX_XX_XX_XX.a2dp_source | sox -t raw -b 16 -c 2 -v 1 -r 44100 -L -e signed-integer - -t wav - | sudo ./pifmrds -freq 100.3 -audio -   

打开收音机,调整到正确的频率上,是不是能听到输出设备中的声音啦?

但是有一点不太好,其他设备上的音乐或者视频一旦暂停,就会停止向树莓派输出音频流,我们的发射也随之戛然而止。也就是只要一小会没有进程使用音频输出,其他设备就会暂停向树莓派输出音频流。怎么办呢?

让某个进程一直循环播放一段无声音频不就行了吗?没有其他进程播放音乐时,是一直占用着音频通道,因此就不会暂停输出音频流;当其他应用想要播放音频时,这个“守护进程”又没有声音,所以也不会影响到其他进程播放声音进行发射。当即用OBS录制了一段无声音频,效果杠杠的!这样,利用蓝牙,将其他设备的声音传送到树莓派上发射就完美了。

当然除此之外,rpitx还可以发射其他信号

载波

Carrier 一段产生于 434MHZ 的简单载波。

啁啾

Chirp 一段围绕434MHZ移动的载波。

波谱

Spectrum SDR 上的瀑布上会显示一张图片。 请注意,您应该根据您的接收情况和您使用的 SDR 软件进行一些调整,以获得正确的对比度和尺寸。

射频我的脸

Rfmyface 使用 raspicam 对您的脸部进行波谱绘画,乐趣无穷!

FM广播

FMRDS 使用 RDS 广播 FM。 您可以通过 SDR 收到它。 这是可以在调频收音机或接收器上听到的调制,但这里频率太高。

SSB单边带

SSB 这是经典的业余无线电模拟语音调制。 使用 SDR在 USB 模式下。

SSTV 慢扫描电视

SSTV 这是一种使用音频调制的图像传输模式(USB模式)。 您需要一个额外的软件来解码和显示它(qsstv,msstv …)。 演示使用sstv的Martin1模式。

Pocsag(寻呼机模式)

pocsag 这是寻呼机使用的模式。 您需要额外的软件来解码。 将 SDR 设置为 NBFM 模式。

Freedv(数字语音)

freedv 这是最先进的开源数字调制。 您需要 Freedv 进行解调。

Opera (信标台)

opera 这是一种听起来像莫尔斯电码的信标模式。 您需要模式 0.5 的 Opera模式 才能解码。

更多内容 可以看 https://github.com/F5OEO/rpitx

参考

用树莓派搭建自己的FM电台并进行直播

用树莓派自制FM电台

https://github.com/ChristopheJacquet/PiFmRds/issues/161


用树莓派搭建自己的FM电台并进行直播
https://blog.quickso.cn/2024/01/14/用树莓派搭建自己的FM电台并进行直播/
作者
木子欢儿
发布于
2024年1月14日
许可协议