You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派Telegram Bot音频控制咨询:支持MP3播放及输出切换的方案

树莓派Telegram Bot控制MP3播放:解决播放/暂停/停止+音频输出问题

嘿,针对你在树莓派上搭建Telegram Bot控制10小时MP3的需求,我整理了几个实用方案,既能解决播放控制的痛点,又能灵活选择音频输出设备:

方案1:Python-VLC库(首推!功能最全面)

VLC的Python绑定是我平时做树莓派音频项目的首选,它支持完整的播放/暂停/停止控制,还能直接指定音频输出设备,完全适配你的场景,而且不需要额外的txt文件中转指令,逻辑更简洁。

操作步骤:

  1. 先装依赖:
    sudo apt-get install vlc python3-vlc
    
  2. 结合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是个不错的选择,它支持通过系统信号控制播放状态,也能指定音频输出设备,适合和你的“指令文件中转”方案搭配。

操作步骤:

  1. 安装mpg123:
    sudo apt-get install mpg123
    
  2. 核心控制命令:
    • 启动播放(强制耳机输出):
      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来模拟键盘操作:

  1. 装依赖:
    sudo apt-get install xdotool
    
  2. 启动Omxplayer(不要加--no-keys):
    omxplayer -o local /home/pi/Desktop/10hRock.mp3 &
    echo $! > /tmp/omxplayer_pid.txt
    
  3. 发送暂停/继续指令(模拟按p键):
    xdotool key --window $(xdotool search --pid $(cat /tmp/omxplayer_pid.txt)) p
    
  4. 发送停止指令(模拟按q键):
    xdotool key --window $(xdotool search --pid $(cat /tmp/omxplayer_pid.txt)) q
    

注意:这个方法需要Omxplayer有对应的窗口,在无桌面环境的树莓派上可能失效,稳定性不如前两个方案。

方法B:进程信号强制停止

如果只需要停止功能,直接用pkill就行:

pkill omxplayer

但这个方法没法实现暂停,只能彻底停止播放。

额外技巧:强制所有音频输出到耳机

不管用哪个播放器,都可以通过修改ALSA配置让音频默认从耳机输出,省得每次都设置:

  1. 编辑ALSA配置文件:
    sudo nano /etc/asound.conf
    
  2. 添加以下内容:
    pcm.!default {
        type hw
        card 0
        device 0
    }
    
    ctl.!default {
        type hw
        card 0
    }
    
  3. 重启音频服务生效:
    sudo alsa force-reload
    

你可以用aplay -l命令查看自己的音频设备列表,确认card和device的编号是否正确。


内容的提问来源于stack exchange,提问作者Eric Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:37:50