使用multiprocessing创建多个进程达到同时播放音乐的目的,使用多线程则会出现:创建新的线程的时候卡顿。
于此同时multiprocessing可以直接对进程进行控制,可以直接杀死进程!
import contextlib
import multiprocessing
import time
import wave
import eyed3
def get_duration(file_path):
"""
获取音乐时长
:param file_path: 文件路径
:return:
"""
if file_path.split('.')[-1] == "mp3":
duration = eyed3.load(file_path).info.time_secs
elif file_path.split('.')[-1] == "wav":
with contextlib.closing(wave.open(file_path, 'r')) as f:
frames = f.getnframes()
rate = f.getframerate()
duration = frames / float(rate)
else:
raise Exception("必须为MP3或者wav格式")
return duration
def play(filepath,start_time=0, loop=1):
import pygame
pygame.mixer.init()
print("开始播放音乐", filepath)
try:
# 算出播放的时长
if loop == -1:
# 如果时间循环为无限长
length = 1000000 # 辣么设置时长为这么长
else:
length = get_duration(filepath) * loop - start_time + 1
# s = pygame.mixer.Sound(filepath)
pygame.mixer.music.load(filepath)
pygame.mixer.music.play(start=start_time, loops=loop)
# s.play(start_time)
time.sleep(length) # 程序休眠
print("播放结束", filepath)
except FileNotFoundError:
print("文件未找到")
if __name__ == '__main__':
# 记得加上’r‘才不会转义,当然如果啥都不知道,就直接加上就好了
path = r"C:\Users\asked\Desktop\1\sketch_220405b\data\1.mp3"
start_time = 10.7 # 从10.7秒开始播放
music1 = multiprocessing.Process(target=play, args=(path, start_time))
music1.start()
# 需要跟文件python同个目录 可以用相对路径 ../music.mp3
path2 = r"groove.mp3"
# 重复2次
loop = 2 # -1 是无限循环
music2 = multiprocessing.Process(target=play, args=(path2, 0, loop))
music2.start()
# 程序暂停5秒后
time.sleep(5)
# 停止音乐1
music1.kill()