使用pygame.mixer.music实现音频控制

冷暖自知 提交于 2020-10-27 08:31:11

引言

要使用python实现对音频的控制,有多种方式,第三方的库比如pyaudio、Simpleaudio、pygame,也可使用os.system调用命令行的方式。博主在对比使用之后推荐pygame,功能比较齐全,开发方便。

pygame music介绍

pygame是开发游戏的第三方库,众所周知,游戏大多数都是有声音的,因此在pygame中有对音频的控制模块,比如音频的简单播放停止、设置音量等,官方连接:https://www.pygame.org/docs/ref/music.html

代码实现

根据官方模块,我们可以封装一个类,实现对音频的控制。
功能:后台线程播放、加载单个音频文件、加载播放列表、清空列表、暂停、继续播放、设置和获取音量大小。具体实现代码如下:

# -*- coding: utf-8 -*-
__author__ = "kaspar.s"
__date__ = '2020/7/28 16:44'
# 音频控制线程

import threading
import time
import pygame

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.daemon = True  # 主线程结束,此线程结束

        pygame.mixer.init()
        self._handler = pygame.mixer.music

        self._file = None
        self._stop_sign = False
        self._pause = False

        self._playlist = []

    def load_file(self,file):
        "加载单个音频文件"
        self._handler.load(file)

        self._file = file
        self._stop_sign = False
        self._pause = False

    def load_files(self,files):
        "加载播放列表"
        self._playlist = []
        self._playlist = files
        self._playlist_len = len(self._playlist)
        self._turn = 0 # 轮流
        self.load_file(self._playlist[self._turn])

    def clear_files(self):
        "清空播放列表"
        if self._handler.get_busy():
            self.pause()

        self._playlist.clear()
        self._playlist_len = 0
        self._file = None

    def run(self):
        while self.is_alive():
            if not self._stop_sign and self._file:
                try:
                    if self._pause:
                        self._handler.unpause()
                        self._pause = False
                    else:
                        self._handler.play(0)
                    while self._handler.get_busy() and (not self._stop_sign):
                        time.sleep(0.5)

                    # 播放下一首
                    if not self._handler.get_busy() and (not self._stop_sign):
                        self._turn += 1
                        if self._turn == self._playlist_len:
                            self._turn = 0
                        self.load_file(self._playlist[self._turn])

                except:
                    pass

                if self._stop_sign:
                    self._handler.pause()
                    self._pause = True

            else:
                time.sleep(0.5)

    def pause(self):
        self._stop_sign = True

    def unpause(self):
        self._stop_sign = False

    def set_volume(self,int):
        self._handler.set_volume(int/100.0)

    def get_volume(self):
        self._handler.get_volume()*100

二赛君原创,转载需注明出处,谢谢。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!