python中播放音频的若干种方式

前言

最近在做一个音乐自动化的工具, 涉及到背景音乐播放, 这里总结几种播放音频的方法, 如下

第一种 使用pygame模块

  1. 模块安装

    1
    pip install pygame
  2. 播放代码示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import 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()

优点: 支持wavmp3格式

缺点: 声音是单声道的, 失真比较严重

第二种 使用pyaudio模块

  1. 模块安装

    1. 由于pyaudio的运行需要依赖portaudio, 因此需要先安装

      Mac平台直接运行以下指令即可

      1
      brew install portaudio

      其他平台可参考pyaudio官方说明文档 点击进入

    2. 安装pyaudio

      1
      pip install pyaudio
  2. 播放代码示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import 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, MacLinux平台

缺点: 不能播放mp3格式音频, 模块安装相对费劲

第三种 使用simpleaudio

  1. 模块安装

    1
    pip install simpleaudio
  2. 播放代码

    1
    2
    3
    4
    5
    import 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 :

GitHub

多格式音频播放实现
  1. 模块安装

    1
    pip install pydub
  2. 格式转换 比如mp3wav

    1
    2
    3
    4
    5
    from pydub import AudioSegment

    def trans_mp3_to_wav(filepath):
    song = AudioSegment.from_mp3(filepath)
    song.export("now.wav", format="wav")
  3. 配合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方式:

  1. Mac平台

    1
    brew install ffmpeg
  2. Windows平台

    1. Windows binaries provided here下载并提取libav
    2. 添加libav /bin 文件夹到你的环境变量(PATH)
  3. Linux平台

    1
    apt-get install ffmpeg

总结

除了以上几种之外还有一些其他的音频播放模块, 不过大多数都有各自的局限性, 结合自身需求进行选用即可

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%