http的mp3流媒体链接,基本就是生成一个流媒体链接,然后套各种播放器的壳打开,原理都一样
https://radio.chatcyf.com/chenyifaer.mp3
播放器版,可能要缓冲一会儿才能打开
陈一发儿直播的纯音频转播
地址:https://www.chatcyf.com/live/
前些日子想搞个网络版的陈一发儿电台,大概内容就是把读邮件,唱歌,以及精彩的闲聊部分,用纯音频的方式,随机播放推流出去。
说白了,就是个没有画面的网络直播,因为实体FM电台搭建需要各种广播设备,当然还有执照什么的,所以只能搞个网络版的玩玩。
到这里,可能就有人会问,那这个和下载到手机中的mp3音乐有什么区别?
手机中的mp3属于点播性质,就是想听什么就可以点什么听,而这种电台版,讲究的就是一个随缘,我这边随机推流到什么,接收端就只能跟着听什么。
比较适合开车的时候听,至于怎么在车上播放,也是得用手机播放,然后靠蓝牙或者DLNA什么的发送到车上听吧。
毕竟都说在电台中听到的歌比手机手动点播的更好听嘛,未知才有惊喜~
至于这玩意还可以干什么,比如这个html5的分享代码,以及成果
成品演示可以看网站首页的播放器模块
代码
<!-- require APlayer -->
<link rel="stylesheet" href="https://cdn.chatcyf.com/static/jsdelivr/APlayer/dist/APlayer.min.css">
<script src="https://cdn.chatcyf.com/static/jsdelivr/APlayer/dist/APlayer.min.js"></script>
<!-- require MetingJS -->
<script src="https://cdn.chatcyf.com/static/jsdelivr/APlayer/dist/Meting.min.js"></script>
<meting-js
name="陈一发儿电台"
artist="ChatCYF"
url="https://radio.chatcyf.com/chenyifaer.mp3"
cover="https://cdn.chatcyf.com/static/2020/05/1589707290-561c9ab24f7b7cc.jpg">
</meting-js>
又新增了直播转播音频版,效果看上面,这里分享两个音频直播间的html的代码
<!-- require APlayer -->
<link rel="stylesheet" href="https://cdn.chatcyf.com/static/jsdelivr/APlayer/dist/APlayer.min.css">
<script src="https://cdn.chatcyf.com/static/jsdelivr/APlayer/dist/APlayer.min.js"></script>
<!-- require MetingJS -->
<script src="https://cdn.chatcyf.com/static/jsdelivr/APlayer/dist/Meting.min.js"></script>
<meting-js
name="陈一发儿直播音频"
artist="ChatCYF"
url="https://radio.chatcyf.com/chatcyf.mp3"
cover="https://cdn.chatcyf.com/static/2020/05/1589799830-55c03779d7d1f15.jpg">
</meting-js>
又或者在欧洲卡车模拟2,或者美国卡车模拟这种游戏里面,可以自定义添加电台
那么也就是说,手动添加完了以后,就可以一边在游戏中开车一边听发酱电台了
编辑我的文档/Euro Truck Simulator 2文件夹中的live_streams.sii,按格式添加
stream_data[0]: "http://107.173.255.235:1354/chenyifaer.mp3|Chenyifaer|Sim radio|CN|128|0"
游戏内效果这样
分享一下搭建的制作流程
买个vps,最好流量大点,用debian或者ubuntu系统,直接这个代码安装
sudo apt-get install icecast2
更多设置的细节部分点这里:https://www.mfpud.com/topics/12913/
接下来说推流部分
使用ubuntu或者debian之类的系统,借助.sh脚本,用python的.py脚本推流,需要把一大堆mp3文件上传到同一个目录,然后给这些mp3批量随机重命名,因为推流包含特殊字符或者中文的mp3文件可能会报错,所以直接推流随机重命名之后的文件。
大概流程,把所有mp3音频文件上传到某个目录,比如 /www/wwwroot/voice
重命名的.sh脚本
#!/bin/bash
# 设置文件夹路径
folder_path="/www/wwwroot/voice"
# 进入文件夹
cd $folder_path
# 随机重命名
for file in *; do
# 生成10位随机字符串
random_name=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1)
# 获取文件扩展名
extension="${file##*.}"
# 生成新的文件名
new_name=$random_name.$extension
# 重命名文件
mv "$file" "$new_name"
done
echo "重命名完成!"
负责推流的 radio.sh 和 radio.py 脚本代码,把这两个文件放到 /www/wwwroot/Radio/ 目录中。
使用 radio.sh去推动 radio.py,设置了每隔72小时重启一次。
#!/bin/bash
# 设置程序路径和名称
program_path="/www/wwwroot/Radio/radio.py"
file_to_delete="/www/wwwroot/Radio/ice_cast"
while true; do
# 删除文件(如果存在)
if [ -f "$file_to_delete" ]; then
rm "$file_to_delete"
fi
# 运行程序
python "$program_path"
# 暂停3天(259200秒)
sleep 259200
done
import os
import random
import subprocess
icecast_server = "source:password@127.0.0.1:1354"
mount_point = "chenyifaer.mp3"
playlist_file = "playlist.m3u"
# 遍历目录中的所有MP3文件
directory_path = "/www/wwwroot/voice"
mp3_files = []
for root, dirs, files in os.walk(directory_path):
for file in files:
if file.endswith(".mp3"):
mp3_files.append(os.path.abspath(os.path.join(root, file)))
# 随机打乱MP3文件列表
random.shuffle(mp3_files)
# 创建M3U播放列表文件
with open(playlist_file, "w") as f:
for file in mp3_files:
f.write(f"file '{file}'\n")
# 使用FFmpeg进行推流
ffmpeg_cmd = [
"ffmpeg",
"-re",
"-f",
"concat",
"-safe",
"0",
"-i",
playlist_file,
"-c:a",
"libmp3lame",
"-f",
"mp3",
"ice_cast", "icecast://source:password@127.0.0.1:1354/chenyifaer.mp3"
]
subprocess.call(ffmpeg_cmd)
# 删除临时生成的播放列表文件
os.remove(playlist_file)
推流方式是,使用 screen -S radio 新建个后台终端窗口
之后是
cd /www/wwwroot/Radio/
./radio.sh
在群晖NAS里面,使用虚拟机装了个windows7系统的方案。
安装个音乐播放器,随机播放添加的音频文件,然后使用buff这个软件推流到服务器。
不过群晖的虚拟机安装系统后没有声卡驱动,所以找了个虚拟声卡软件,Voicemeeter,这个软件本来是虚拟音频调音台软件,这里只用它虚拟声卡的功能。
推流界面大概这样子
顺便补充一下视频直播的纯音频推流部分,简易代码
不过不推荐用代码的,推荐用借助 docker 的 restreamer 里面的转发工具,还可以添加多个音频推流,以及视频推流,全部一站式解决了。
streamlink https://www.youtube.com/channel/UC7QVieoTCNwwW84G0bddXpA/live best -O | ffmpeg -re -i pipe:0 -c:v none -acodec libmp3lame -ar 44100 -ab 128k -f mp3 "icecast://source:password@127.0.0.1:1354/chatcyf.mp3"