0
点赞
收藏
分享

微信扫一扫

Python工具箱系列(五十八)

播放音频文件

无数的音乐播放器可以对音频文件进行播放,这些播放器如何操作不在本文讨论之列。本文只是从python工具箱的角度来看,如何在python代码中播放音频文件,主要是mp3文件。特别神奇的一点是在python的世界里,真的是没有特别好的播放器!笔者试验了多个第三方库,发现能用的底层基本是都是pygame这个游戏库,演示代码如下所示。

import time
import pygame
from pydub import AudioSegment
from pydub.playback import play
from pydub.utils import mediainfo


def playmp3(mp3filename):
    """
    播放MP3文件

    Args:
        mp3filename (string): 要播放的MP3文件名
    """
    song = AudioSegment.from_mp3(mp3filename)
    play(song)


def playmp3_sleep(mp3filename):
    """
    播放MP3文件

    Args:
        mp3filename (string): 要播放的MP3文件名
    """
    song = mediainfo(mp3filename)
    dur = song['duration']

    pygame.init()
    pygame.mixer.init()
    pygame.mixer.music.load(mp3filename)
    pygame.mixer.music.set_volume(60)
    pygame.mixer.music.play()
    time.sleep(round(float(dur)))


def playmp3_event(mp3filename):
    """
    播放MP3文件

    Args:
        mp3filename (string): 要播放的MP3文件名
    """

    pygame.init()

    MUSIC_END = pygame.USEREVENT + 1
    # 设置当前音乐播放完成后,发送自定义的消息
    pygame.mixer.music.set_endevent(MUSIC_END)

    # 延时0.2秒打开声音,避过爆破音
    pygame.time.delay(200)
    pygame.mixer.init()                           # 初始化
    pygame.mixer.music.load(mp3filename)   # 加载音乐文件
    pygame.mixer.music.set_volume(60)
    pygame.mixer.music.play()                     # 开始播放音乐流

    # 定义一个退出程序标志
    requireQuit = False

    while not requireQuit:
        # 循环接受各种事件
        for event in pygame.event.get():
            # 如果是自定义的播放完成消息
            if event.type == MUSIC_END:
                print("end event")
                requireQuit = True  # 退出
                pygame.mixer.music.fadeout(60000)
                pygame.mixer.stop()
                break

        time.sleep(1)

    print("done")


def test_player():
    mp3file = r'D:\test\Delicate.mp3'
    playmp3(mp3file)
    playmp3_sleep(mp3file)
    playmp3_event(mp3file)

由于上述代码的底层是pygame,必须进行安装。

pip install pyaudio
pip install pydub
pip install pygame

在上面的代码中,使用了三种播放MP3的方法。

playmp3_event函数建立了pygame完整的循环架构。当音乐播放完成后会释放用户自定义的事件,从而结束播放。这个函数还可以进一步扩充,以响应键盘的输入,从而可以快进/快退等

playmp3_sleep函数则简单一些,不使用完成的循环架构,直接从mp3文件中拿到音乐的时长,开始播放后,使用sleep进行等待。等睡眠结束时,音乐正好播放完然后一起退出

playmp3没有使用pygame,而直接使用pydub库进行播放,写法简洁明快,但运行后能够看到,底层仍然是调用pygame库

举报

相关推荐

0 条评论