python播放音乐的策略,使用playsound在arm平台会出错
即使安装了系统依赖,pygobject 在 ARM 系统上可能还是会出问题。让我们直接使用更简单可靠的解决方案:
方案 1: 使用 pygame (最推荐)
bash
pip install pygame
python
import pygame
import time
def play_audio(file_path, duration_ms):
try:
# 初始化 pygame 混音器
pygame.mixer.init()
# 加载并播放文件
pygame.mixer.music.load(file_path)
pygame.mixer.music.play()
print(f"正在播放: {file_path}, 时长: {duration_ms}ms")
# 等待指定时长
start_time = time.time()
while (time.time() - start_time) * 1000 < duration_ms:
if not pygame.mixer.music.get_busy():
break # 如果播放提前结束就退出
time.sleep(0.1)
print("播放完成")
except Exception as e:
print(f"播放音频出错: {e}")
finally:
# 确保停止播放并清理资源
if pygame.mixer.get_init():
pygame.mixer.music.stop()
pygame.mixer.quit()
使用示例
play_audio("/mnt/sda/music/chanfu.mp4", 1000)
方案 2: 使用系统音频播放器 (最稳定)
bash
安装 mpg123 (支持 MP3/MP4)
sudo apt install mpg123
或者安装 ffmpeg (功能更全面)
sudo apt install ffmpeg
python
import subprocess
import time
import os
def play_audio(file_path, duration_ms):
"""使用系统音频播放器"""
if not os.path.exists(file_path):
print(f"文件不存在: {file_path}")
return False
try:
duration_sec = duration_ms / 1000
# 检查可用的播放器
players = [
('mpg123', ['mpg123', '-q', file_path]),
('ffplay', ['ffplay', '-nodisp', '-autoexit', file_path]),
('mplayer', ['mplayer', file_path])
]
for player_name, cmd in players:
try:
# 检查播放器是否可用
subprocess.run(['which', player_name], check=True, capture_output=True)
print(f"使用 {player_name} 播放音频...")
# 启动播放进程
process = subprocess.Popen(cmd)
# 等待指定时长
time.sleep(duration_sec)
# 停止播放
process.terminate()
process.wait(timeout=2)
print("播放完成")
return True
except subprocess.CalledProcessError:
continue # 播放器不可用,尝试下一个
except subprocess.TimeoutExpired:
process.kill() # 强制结束
process.wait()
print("没有找到可用的音频播放器,请安装 mpg123 或 ffmpeg")
return False
except Exception as e:
print(f"播放音频出错: {e}")
return False
使用示例
play_audio("/mnt/sda/music/chanfu.mp4", 1000)
方案 3: 使用 pydub + simpleaudio
bash
安装必要的包
sudo apt install ffmpeg
pip install pydub simpleaudio
python
from pydub import AudioSegment
from pydub.playback import play
import time
def play_audio(file_path, duration_ms):
try:
# 加载音频文件
print(f"加载音频文件: {file_path}")
audio = AudioSegment.from_file(file_path)
# 如果音频长度超过指定时长,进行裁剪
if len(audio) > duration_ms:
audio = audio[:duration_ms]
print(f"音频已裁剪至 {duration_ms}ms")
print("开始播放...")
# 播放音频
play(audio)
print("播放完成")
except Exception as e:
print(f"播放音频出错: {e}")
使用示例
play_audio("/mnt/sda/music/chanfu.mp4", 1000)
方案 4: 使用 vlc (功能强大)
bash
pip install python-vlc
python
import vlc
import time
def play_audio(file_path, duration_ms):
try:
# 创建 VLC 实例
instance = vlc.Instance('--no-xlib --quiet') # 禁用图形界面
player = instance.media_player_new()
# 设置媒体文件
media = instance.media_new(file_path)
player.set_media(media)
print(f"开始播放: {file_path}")
# 开始播放
player.play()
# 等待播放开始
time.sleep(0.5)
# 等待指定时长
time.sleep(duration_ms / 1000)
# 停止播放
player.stop()
print("播放完成")
except Exception as e:
print(f"播放音频出错: {e}")
使用示例
play_audio("/mnt/sda/music/chanfu.mp4", 1000)
快速测试脚本
python
def test_all_methods():
"""测试所有可用的音频播放方法"""
file_path = "/mnt/sda/music/chanfu.mp4"
duration_ms = 1000
methods = [
("pygame", play_audio_pygame),
("system_player", play_audio_system),
("pydub", play_audio_pydub),
("vlc", play_audio_vlc)
]
for name, method in methods:
print(f"\n=== 测试 {name} ===")
try:
method(file_path, duration_ms)
print(f"✓ {name} 工作正常")
except Exception as e:
print(f"✗ {name} 失败: {e}")
运行测试
test_all_methods()
我的建议
直接使用方案 1 (pygame),因为:
安装简单:pip install pygame
跨平台兼容性好
不需要复杂的系统依赖
代码简洁易用
如果 pygame 不工作,使用方案 2 (系统播放器),安装 mpg123 或 ffmpeg 即可。
不要再折腾 pygobject 了,它在 ARM 系统上依赖太多,容易出问题。