前言
最近在做一个音乐自动化的工具, 涉及到背景音乐播放, 这里总结几种播放音频的方法, 如下
第一种 使用pygame模块
模块安装
1
pip install pygame
播放代码示例
1
2
3
4
5
6
7
8
9
10
11import pygame
def playMusic(fileName):
# 初始化
pygame.mixer.init()
# 加载音频文件
pygame.mixer.music.load(fileName)
# 设置音量 范围为0.0到1.0
pygame.mixer.music.set_volume(0.5)
# 开始播放
pygame.mixer.music.play()
优点: 支持wav
和mp3
格式
缺点: 声音是单声道的, 失真比较严重
第二种 使用pyaudio模块
模块安装
由于
pyaudio
的运行需要依赖portaudio
, 因此需要先安装Mac
平台直接运行以下指令即可1
brew install portaudio
其他平台可参考
pyaudio
官方说明文档 点击进入安装
pyaudio
1
pip install pyaudio
播放代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19import pyaudio
import wave
def playMusic(fileName):
chunk = 1024
wf = wave.open(fileName, 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(chunk)
while len(data) > 0:
stream.write(data)
data = wf.readframes(chunk)
stream.stop_stream()
stream.close()
p.terminate()
优点: 支持音频录制, 回放为立体声, 支持Windows
, Mac
和Linux
平台
缺点: 不能播放mp3格式音频, 模块安装相对费劲
第三种 使用simpleaudio
模块安装
1
pip install simpleaudio
播放代码
1
2
3
4
5import simpleaudio as sa
def playMusic3(fileName):
wave_obj = sa.WaveObject.from_wave_file(fileName)
play_obj = wave_obj.play()
play_obj.wait_done()
优点: 声音为立体声 安装简单
缺点: 不能播放mp3格式音频
第四种 综合版
上面几种方式总是不太完美, 有没有一种既支持mp3和wav格式, 又能立体声播放, 同时使用起来又方便的方式, 答案是 没有 哈哈
不过 我们可以借助一个音频格式转换工具然后配合simpleaudio
, 就能实现我们的完美需求, 这个工具就是pydub
pydub
不仅可以对音频进行格式转换, 还可以对音频进行切片(比如我播放音乐的前10秒 ), 淡入淡出, 以及获取音频总时长
更多用法可以参见github
:
多格式音频播放实现
模块安装
1
pip install pydub
格式转换 比如
mp3
转wav
1
2
3
4
5from pydub import AudioSegment
def trans_mp3_to_wav(filepath):
song = AudioSegment.from_mp3(filepath)
song.export("now.wav", format="wav")配合
simpleaudio
播放音频1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pydub import AudioSegment
import simpleaudio as sa
def trans_mp3_to_wav(filepath):
song = AudioSegment.from_mp3(filepath)
song.export("./now.wav", format="wav")
def playMusic(fileName):
wave_obj = sa.WaveObject.from_wave_file(fileName)
play_obj = wave_obj.play()
play_obj.wait_done()
if __name__ == '__main__':
trans_mp3_to_wav("bgm2.mp3")
playMusic("now.wav")
注意事项: 由于pydub这个模块, 过分依赖ffmpeg
, 因此我们在使用时如果报错:
FileNotFoundError: [Errno 2] No such file or directory: 'ffprobe'
那么需要先安装ffmpeg
各大平台安装ffmpeg
方式:
Mac平台
1
brew install ffmpeg
Windows平台
- 从Windows binaries provided here下载并提取
libav
; - 添加libav
/bin
文件夹到你的环境变量(PATH)
- 从Windows binaries provided here下载并提取
Linux平台
1
apt-get install ffmpeg
总结
除了以上几种之外还有一些其他的音频播放模块, 不过大多数都有各自的局限性, 结合自身需求进行选用即可
本文为作者原创转载时请注明出处 谢谢