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

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

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

引子

我很早很早,在上高中时就听说过树莓派能够发射广播信号,奈何当时没有树莓派,无法进行尝试。去年下半年买了树莓派之后,我也第一时间进行了很多次尝试,但是都是以失败告终。年后在舍友和网络上的信息的帮助下,终于成功用树莓派搭建一个自己的FM电台并发射了直播信号进行直播。最近几天稍微有了些时间,简单记录下整个过程,希望能够帮助到同样对此感兴趣的人。

本文参考了使用树莓派搭建一个个人广播站这篇文章,非常感谢原作者,本文主要就是在这篇文章的基础上进行补充和拓充的。也因此最前面的安装过程本文会从简。下面正文开始咯。

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

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

安装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的代码:git clone https://github.com/F5OEO/rpitx
  2. 进入rpitx文件夹:cd rpitx
  3. 安装rpitx:./install.sh

之后就是漫长的安装过程了,中间会有一些报错,但是只要安装没有停下来就问题不大。放一张原作者安装成功的图,我编译的截图早就不知道那里去了Orz...

完成安装过程

在安装最后,会提示是否允许修改 /boot/config.txt,这一步要求我们将GPU的频率锁定在250Mhz,并设置force_turbo=1强制超频。注意!设置force_turbo=1强制超频将使得树莓派保修失效。输入y并回车,之后重启树莓派即可。重启测试成功之后可以再修改回原有参数500M,实测没有大问题,但是force_turbo=1不可以修改。

rpitx测试

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

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

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

树莓派引脚

使用rpitx播放音乐

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

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

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

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

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

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

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

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

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

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

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

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的组合拳,把串流直播出来:
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文件夹,输入命令:
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. 建立一个局域网内的直播服务器,使用其他设备进行收音并推流刀直播服务器,从树莓派上拉流进行直播。

这两种方案我都简单实践过,先是测试了第一种方法,花费10元钱淘宝包邮买了个声卡。建议购买声卡尝试的时候参照自己的经济能力,尽量买好一点的,10块钱包邮的声卡音质真的非常烂,还有杂音...第二种方案我是用的是Nginx-rtmp,服务器建立在树莓派上,但是有的时候有些许卡顿,将服务器搭建在PC上或许效果会好很多。其中第二种方法篇幅会比较长,有时间我会并单独开一篇文章好好记录一下。

2021年6月12日更新:
今天考完六级,晚上决定Happy下 (喝杯茶,喝个靓靓的杯) 。于是再次尝试了第一种方案,竟然——成功啦!于是赶紧再来记录一下第一种方案的实施过程。

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

我的声卡非常垃圾,或许是因为驱动或者声卡本身不支持热插拔,一开始插上USB声卡,尽管右上角显示检测到了USB声音输出设备,但插上耳机或者线路输入,声卡并不工作。于是重启了一下树莓派,声卡就工作正常了。连接上声卡的3.5麦克风口到其他设备的耳机孔/线路输出孔,就可以进行下面的操作了。

  1. 先查询一下当前系统中的声音输入设备:pacmd list | grep "input" 可以看到,有一个名叫alsa_input.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-00.mono-fallback的设备。复制设备的设备名称备用。
    input
  2. cd到rpitx的目录,执行上面提到的输出命令:
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电台并进行直播这一终极目标终于实现,我们可以利用树莓派发射自己喜欢的节目咯。

2021年8月7日更新:
今天从自习室回来的比较早(受不了自习室的蚊子了2333),路上突发奇想,能不能利用树莓派的蓝牙,将手机或者电脑上的声音传送到树莓派上直接发射出来;而不用上一章节中提到的方法,设备先经过音频输出,再经过有线连接,将声音传输到声卡上,再转换成数字信号进行处理并且发射呢?这样能减少很多步骤,而且也不用进行数字-模拟-数字转换,音质和延迟都会有很大的提升。说干就干,这就有了下一章节。

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

要想让其他设备能连接上树莓派,并且将音频信号传送给树莓派,首先得让其他设备认为树莓派是音频设备(比如蓝牙耳机),这样才能将音频输出切换到树莓派上,并自然的传送音频信号给树莓派进行发射了。实测可以将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的目录,执行上面提到的输出命令:
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录制了一段无声音频,效果杠杠的!这样,利用蓝牙,将其他设备的声音传送到树莓派上发射就完美了。

本文永久链接:https://blog.xmgspace.me/archives/set-up-fm-station-with-raspberry-pi.html
本文文章标题:用树莓派搭建自己的FM电台并进行直播
如无特殊说明,只要您标明转载自Xiaomage's Blog,就可自由转载本文。禁止CSDN/采集站采集转载。
授权协议:署名-非商业性使用-相同方式共享 4.0(CC BY-NC-SA 4.0)

评论

  1. 自镇流高压汞灯
    Windows Firefox
    3年前
    2021-8-21 11:42:12

    蓝牙那个不是我先在评论区提的吗?

    • 博主
      自镇流高压汞灯
      Android Chrome
      3年前
      2021-8-23 10:09:28

      确实😂时间比较久了,可能就忘了评论区里这回事了,但肯定还是有一点印象的,这样后来才能想起来。感谢你之前的想法,要不然可能就想不到了,就没法实现了。

  2. 巨硬中冰
    Android Chrome
    已编辑
    3年前
    2021-6-21 2:48:09

    寒假在家的时候玩过这个,发现rpitx在不同频率下发射覆盖效果也是不一样的,在FM频段附近效果最好的是86MHz左右,插上一个电脑机箱蜂鸣器做天线(直流电阻12Ω左右)在86.8MHz下覆盖半径可达15米以上,PL-310ET收音机在距离天线约10米的位置的场强读数可以达到40dBμV左右,甚至强过本地10kW发射的调频电台。而设置频率为之前模拟电视采用的2频道伴音64.25MHz效果就差很多

    • 博主
      巨硬中冰
      Windows Edge
      3年前
      2021-6-24 14:33:35

      应该是有个中心频点的,收音机里面跟中频有关系,树莓派上面应该也是类似的吧,可能跟天线的长度之类也有关系。我插上一段15厘米左右的杜邦线,也能覆盖几十米,左右五六间宿舍都能听清楚。说实话巴不得距离近一些😂能覆盖一两间屋子就可以了,为此我还专门选择和本地的黑电台的频率重合。

  3. 自镇流高压汞灯
    Windows Firefox
    3年前
    2021-6-01 13:28:26

    能否通过蓝牙将声音输入树莓派来进行直播?

    • 博主
      自镇流高压汞灯
      Windows Edge
      3年前
      2021-6-03 22:29:45

      理论上也是可以的,但估计还是得装驱动之类的,因为树莓派不是音频输出设备,所以还得好好折腾一番。

  4. Windows Chrome
    3年前
    2021-5-31 19:17:10

    相比直接听流媒,广播还是发射到收音机里传出来才最有内味儿😜

    • 博主
      qiuyuair
      Macintosh Safari
      3年前
      2021-5-31 22:25:44

      那是 声音从收音机里面出来就感觉不一样,尤其在是老收音机上面。

  5. 自镇流高压汞灯
    Windows Firefox
    3年前
    2021-5-24 13:43:06

    最好是在76-87发射,此处无电台且很多收音机都覆盖这个频段。否则像珠三角这种频率拥挤的地方无立锥之地可供发射。是否有办法通过这个功能输出RF模拟电视信号到电视机以充当显示器?

    • 博主
      自镇流高压汞灯
      Windows Edge
      3年前
      2021-5-25 9:02:35

      我自己发射的话肯定是在76-87发射的,但是考虑到很多收音机只能收到87,就写的87-108.输出模拟电视信号应该是不行的,树莓派的解码有点羸弱...与图像相关的只有SSTV能够发射。

      • 自镇流高压汞灯
        Xiaomage
        Windows Firefox
        3年前
        2021-5-26 1:02:56

        搜了下,选项2和3也能传输图像。

        • 博主
          自镇流高压汞灯
          Windows Edge
          3年前
          2021-5-28 8:33:51

          应该是可以的,但是还是没法像模拟电视那样接收

    • 巨硬中冰
      自镇流高压汞灯
      Android Chrome
      3年前
      2021-6-21 2:42:26

      树莓派这个rpitx的功能很有限,输出AM信号的效果很差,而模拟电视是AM调制的。不过可以用树莓派控制hackrf来发射模拟电视信号。

      • 博主
        巨硬中冰
        Windows Edge
        3年前
        2021-6-24 14:34:42

        hackrf,先记下来了,暑假或者寒假的时候试试~

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇