MacOS+Python3.10播放音频文件报错求助
在MacOS + Python3.10环境下播放音频的问题解决
问题背景
在MacOS系统、Python3.10环境下尝试编写代码播放音频文件,先后使用playsound和pydub库均报错,已尝试部分方案未解决。
第一次尝试:使用playsound库
代码:
from playsound import playsound playsound('/Users/cairo/Desktop/i wish.mp3')
报错信息:
/Users/cairo/PycharmProjects/pythonProject/venv/bin/python /Users/cairo/PycharmProjects/pythonProject/main.py playsound is relying on a python 2 subprocess. Please use `pip3 install PyObjC` if you want playsound to run more efficiently. Traceback (most recent call last): File "/Users/cairo/PycharmProjects/pythonProject/main.py", line 3, in <module> playsound(r'/Users/cairo/Desktop/beep sound 2') File "/Users/cairo/PycharmProjects/pythonProject/venv/lib/python3.10/site-packages/playsound.py", line 244, in <lambda> playsound = lambda sound, block = True: _playsoundAnotherPython('/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python', sound, block, macOS = True) File "/Users/cairo/PycharmProjects/pythonProject/venv/lib/python3.10/site-packages/playsound.py", line 223, in _playsoundAnotherPython raise PlaysoundException('Cannot find a sound with filename: ' + sound) playsound.PlaysoundException: Cannot find a sound with filename: /Users/cairo/Desktop/beep sound 2 Process finished with exit code 1
已执行pip3 install PyObjC,但仍报错。
第二次尝试:使用pydub库
代码:
from pydub import AudioSegment from pydub.playback import play song = AudioSegment.from_wav("/Users/cairo/Desktop/i wish.mp3") play(song)
报错信息:
/Users/cairo/PycharmProjects/beepsound/venv/lib/python3.10/site-packages/pydub/utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning) /Users/cairo/PycharmProjects/beepsound/venv/lib/python3.10/site-packages/pydub/utils.py:198: RuntimeWarning: Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work warn("Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work", RuntimeWarning) Traceback (most recent call last): File "/Users/cairo/PycharmProjects/beepsound/main.py", line 4, in <module> song = AudioSegment.from_wav("/Users/cairo/Desktop/i wish.mp3") File "/Users/cairo/PycharmProjects/beepsound/venv/lib/python3.10/site-packages/pydub/audio_segment.py", line 808, in from_wav return cls.from_file(file, 'wav', parameters=parameters) File "/Users/cairo/PycharmProjects/beepsound/venv/lib/python3.10/site-packages/pydub/audio_segment.py", line 728, in from_file info = mediainfo_json(orig_file, read_ahead_limit=read_ahead_limit) File "/Users/cairo/PycharmProjects/beepsound/venv/lib/python3.10/site-packages/pydub/utils.py", line 274, in mediainfo_json res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/subprocess.py", line 971, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/subprocess.py", line 1847, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'ffprobe' Process finished with exit code 1
问题分析与解决步骤
针对playsound的问题
- 文件路径不匹配:报错提示找不到的文件是
/Users/cairo/Desktop/beep sound 2,但代码里写的是/Users/cairo/Desktop/i wish.mp3,需确认代码中的文件路径和实际文件完全一致,包括文件名、后缀名。 - 版本兼容问题:老版本
playsound在Python3.10下依赖Python2子进程,即使安装PyObjC也可能存在兼容问题。建议卸载现有版本,安装适配Python3的稳定版本:pip uninstall playsound pip install playsound==1.2.2
针对pydub的问题
- 格式调用错误:用
AudioSegment.from_wav()读取MP3文件是错误的,应使用对应格式的方法AudioSegment.from_mp3(),或通用方法AudioSegment.from_file()自动识别格式。 - 缺少依赖工具:pydub依赖
ffmpeg(包含ffprobe),需先通过Homebrew安装:
修改后的运行代码:brew install ffmpegfrom pydub import AudioSegment from pydub.playback import play song = AudioSegment.from_mp3("/Users/cairo/Desktop/i wish.mp3") play(song)
备选方案:使用pygame库
如果上述库仍有兼容问题,可尝试兼容性更好的pygame:
- 安装库:
pip install pygame - 示例代码:
import pygame pygame.mixer.init() pygame.mixer.music.load('/Users/cairo/Desktop/i wish.mp3') pygame.mixer.music.play() while pygame.mixer.music.get_busy(): pygame.time.Clock().tick(10)
内容的提问来源于stack exchange,提问作者Oughtly
相关产品推荐
相关产品推荐

