树莓派Telegram Bot音频控制咨询:支持MP3播放及输出切换的方案
树莓派Telegram Bot控制MP3播放:解决播放/暂停/停止+音频输出问题
嘿,针对你在树莓派上搭建Telegram Bot控制10小时MP3的需求,我整理了几个实用方案,既能解决播放控制的痛点,又能灵活选择音频输出设备:
方案1:Python-VLC库(首推!功能最全面)
VLC的Python绑定是我平时做树莓派音频项目的首选,它支持完整的播放/暂停/停止控制,还能直接指定音频输出设备,完全适配你的场景,而且不需要额外的txt文件中转指令,逻辑更简洁。
操作步骤:
- 先装依赖:
sudo apt-get install vlc python3-vlc - 结合Telegram Bot的核心代码示例(用python-telegram-bot框架):
import vlc from telegram import Update from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes # 初始化VLC播放器实例 vlc_instance = vlc.Instance() player = vlc_instance.media_player_new() # 加载你的MP3文件 media = vlc_instance.media_new('/home/pi/Desktop/10hRock.mp3') player.set_media(media) # 强制设置音频输出为耳机 # 先通过`vlc -H | grep -A 20 "audio output module"`查看可用输出模块 # 树莓派耳机通常对应alsa模块,设备号用`aplay -l`确认,一般是hw:0,0 player.audio_output_set('alsa') player.audio_output_device_set(player.audio_output_get(), 'hw:0,0') # Telegram命令处理函数 async def play_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE): if not player.is_playing(): player.play() await update.message.reply_text("🎸 10小时摇滚开始播放!") else: await update.message.reply_text("已经在播放啦,别着急~") async def pause_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE): if player.is_playing(): player.pause() await update.message.reply_text("⏸️ 已暂停播放") else: await update.message.reply_text("当前没在播放哦") async def stop_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE): player.stop() await update.message.reply_text("🛑 已停止播放") if __name__ == '__main__': # 替换成你的Telegram Bot Token app = ApplicationBuilder().token("YOUR_BOT_TOKEN").build() app.add_handler(CommandHandler("play", play_cmd)) app.add_handler(CommandHandler("pause", pause_cmd)) app.add_handler(CommandHandler("stop", stop_cmd)) app.run_polling()
方案2:mpg123 + Shell脚本(轻量灵活)
如果你偏好轻量级工具,mpg123是个不错的选择,它支持通过系统信号控制播放状态,也能指定音频输出设备,适合和你的“指令文件中转”方案搭配。
操作步骤:
- 安装mpg123:
sudo apt-get install mpg123 - 核心控制命令:
- 启动播放(强制耳机输出):
mpg123 -o alsa:hw:0,0 /home/pi/Desktop/10hRock.mp3 & # 把进程ID存到文件,方便后续控制 echo $! > /tmp/mp3_player_pid.txt - 暂停播放:
kill -STOP $(cat /tmp/mp3_player_pid.txt) - 继续播放:
kill -CONT $(cat /tmp/mp3_player_pid.txt) - 停止播放:
kill -TERM $(cat /tmp/mp3_player_pid.txt) rm /tmp/mp3_player_pid.txt
- 启动播放(强制耳机输出):
你可以在Telegram Bot的代码里,用subprocess模块(比os.system更安全)读取指令文件,然后执行对应的命令。
方案3:改进Omxplayer的控制方式(如果你坚持用它)
Omxplayer确实没有原生的远程控制接口,但可以通过模拟键盘事件或者进程信号来实现部分功能:
方法A:模拟键盘输入(支持暂停/停止)
需要安装xdotool来模拟键盘操作:
- 装依赖:
sudo apt-get install xdotool - 启动Omxplayer(不要加
--no-keys):omxplayer -o local /home/pi/Desktop/10hRock.mp3 & echo $! > /tmp/omxplayer_pid.txt - 发送暂停/继续指令(模拟按p键):
xdotool key --window $(xdotool search --pid $(cat /tmp/omxplayer_pid.txt)) p - 发送停止指令(模拟按q键):
xdotool key --window $(xdotool search --pid $(cat /tmp/omxplayer_pid.txt)) q
注意:这个方法需要Omxplayer有对应的窗口,在无桌面环境的树莓派上可能失效,稳定性不如前两个方案。
方法B:进程信号强制停止
如果只需要停止功能,直接用pkill就行:
pkill omxplayer
但这个方法没法实现暂停,只能彻底停止播放。
额外技巧:强制所有音频输出到耳机
不管用哪个播放器,都可以通过修改ALSA配置让音频默认从耳机输出,省得每次都设置:
- 编辑ALSA配置文件:
sudo nano /etc/asound.conf - 添加以下内容:
pcm.!default { type hw card 0 device 0 } ctl.!default { type hw card 0 } - 重启音频服务生效:
sudo alsa force-reload
你可以用aplay -l命令查看自己的音频设备列表,确认card和device的编号是否正确。
内容的提问来源于stack exchange,提问作者Eric Roy
相关产品推荐
相关产品推荐

