即使安装了系统依赖,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 系统上依赖太多,容易出问题。

标签: none

添加新评论