要用到pygame库
pip install pygame
示例代码:
python
import time
import pygame
class MusicFader:
def __init__(self,fadeDuration,musicDuration):
self.fadeDuration=fadeDuration
self.musicDuration=musicDuration
self.steps=30
def fadeIn(self,musicPath=None):#淡入
if musicPath:
pygame.mixer.music.load(musicPath)#载入音频
pygame.mixer.music.set_volume(0.0)#设置初始音量
pygame.mixer.music.play()#播放音乐
stepTime=self.fadeDuration/self.steps
for i in range(self.steps+1):
volume=i/self.steps
pygame.mixer.music.set_volume(volume)
time.sleep(stepTime)
##逐步提高音量
def fadeOut(self):#淡出
currentVolume=pygame.mixer.music.get_volume()#获取现在音量
if currentVolume<=0:#如果现在音量为0,停止播放
pygame.mixer.music.stop()
return
stepTime=self.fadeDuration/self.steps
for i in range(self.steps+1):
volume=currentVolume*(1- i/self.steps)
pygame.mixer.music.set_volume(max(0,volume))
time.sleep(stepTime)
##逐步降低音量
pygame.mixer.music.stop()
if __name__ == '__main__':
pygame.mixer.init()#初始化mixer
fader=MusicFader(fadeDuration=5.0,musicDuration=83)#5秒淡入淡出,83秒音频时长
fader.fadeIn('1.mp3')#淡入
time.sleep(fader.musicDuration-fader.fadeDuration*2)#音乐主体部分(减去了淡入淡出时间)
fader.fadeOut()#淡出
如果不确定音频文件时长,可以用librosa库
python
pip install librosa
改进代码:
python
import time
import pygame
import librosa
class MusicFader:
def __init__(self,fadeDuration,musicDuration):
self.fadeDuration=fadeDuration
self.musicDuration=musicDuration
self.steps=30
def fadeIn(self,musicPath=None):#淡入
if musicPath:
pygame.mixer.music.load(musicPath)#载入音频
pygame.mixer.music.set_volume(0.0)#设置初始音量
pygame.mixer.music.play()#播放音乐
stepTime=self.fadeDuration/self.steps
for i in range(self.steps+1):
volume=i/self.steps
pygame.mixer.music.set_volume(volume)
time.sleep(stepTime)
##逐步提高音量
def fadeOut(self):#淡出
currentVolume=pygame.mixer.music.get_volume()#获取现在音量
if currentVolume<=0:#如果现在音量为0,停止播放
pygame.mixer.music.stop()
return
stepTime=self.fadeDuration/self.steps
for i in range(self.steps+1):
volume=currentVolume*(1- i/self.steps)
pygame.mixer.music.set_volume(max(0,volume))
time.sleep(stepTime)
##逐步降低音量
pygame.mixer.music.stop()
if __name__ == '__main__':
def getAudioDuration(filePath):
duration=librosa.get_duration(path=filePath)#读取元数据
return round(duration,2)#保留两位小数
fadeDuration=5.0#淡入淡出时长
audio='1.flac'
musicDuration=getAudioDuration(audio)#音频时长
pygame.mixer.init()#初始化mixer
fader=MusicFader(fadeDuration=fadeDuration,musicDuration=musicDuration)
fader.fadeIn(audio)#淡入
time.sleep(fader.musicDuration-fader.fadeDuration*2+1.8)#音乐主体部分(减去了淡入淡出时间)
fader.fadeOut()#淡出
这个代码还有些缺陷,比如淡出的时候会过早一点点结束音频导致结尾一部分音频播放不出来