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

Python Discord音乐机器人播放歌曲数分钟后自动停止问题求助

解决Discord音乐机器人播放30-90秒后自动停止的问题

核心原因分析

出现FFmpeg进程正常终止(返回码0)但音频提前停止的情况,大概率是YouTube音频流的访问权限验证缺失或FFmpeg参数未适配流式播放场景导致的,跨平台出现问题说明和系统环境无关。

针对性解决步骤

1. 修复yt-dlp的音频流获取逻辑

YouTube的音频流链接需要携带验证用的HTTP头(比如Referer、User-Agent),否则会被服务器主动切断连接。需要修改yt-dlp的配置,同时提取这些头信息:

import yt_dlp
import discord

# 调整yt-dlp参数,确保获取完整可流式播放的音频
YDL_OPTIONS = {
    'format': 'bestaudio[ext=m4a]/bestaudio',  # 优先选m4a格式,流式兼容性更好
    'noplaylist': True,
    'quiet': True,
    'extract_flat': False,  # 强制提取完整的媒体信息
}

def get_audio_info(video_url):
    with yt_dlp.YoutubeDL(YDL_OPTIONS) as ydl:
        info = ydl.extract_info(video_url, download=False)
        # 提取音频链接和对应的HTTP头
        return info['url'], info['http_headers']

2. 优化FFmpeg参数配置

除了你已经加的重连参数,还需要添加HTTP持久连接、加大探测缓冲、传递验证头这几个关键参数,避免FFmpeg误判流结束:

def build_ffmpeg_options(headers):
    # 将yt-dlp获取的HTTP头转为FFmpeg可识别的格式
    header_args = []
    for key, value in headers.items():
        header_args.append(f'-headers "{key}: {value}"')
    
    # before_options:处理连接和验证逻辑
    before_options = ' '.join(header_args) + ' -reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 10 -http_persistent 1 -ipv4'
    # options:处理音频解码和缓冲逻辑
    options = '-vn -probesize 100M -analyzeduration 100M'
    
    return {'before_options': before_options, 'options': options}

3. 调整播放逻辑

将上述两个函数结合,确保播放时传递正确的音频链接和FFmpeg参数:

# 假设你已经有了voice_client实例
video_url = "你的YouTube视频链接或搜索关键词解析后的链接"
audio_url, headers = get_audio_info(video_url)
ffmpeg_opts = build_ffmpeg_options(headers)

# 启动播放
voice_client.play(discord.FFmpegPCMAudio(audio_url, **ffmpeg_opts))

4. 额外排查点

  • 升级discord.py到最新稳定版:旧版本的FFmpegPCMAudio存在流式播放的bug,执行pip install --upgrade discord.py更新
  • 检查yt-dlp版本:同样升级到最新版,pip install --upgrade yt-dlp,确保能正确处理YouTube的最新流格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:27:45