python实现音频淡入淡出功能

要用到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()#淡出

这个代码还有些缺陷,比如淡出的时候会过早一点点结束音频导致结尾一部分音频播放不出来

相关推荐
橙橙笔记1 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
小小张说故事2 小时前
Python 的 class 语句到底执行了什么?拆开 __prepare__、metaclass.__new__ 和那个被讲反的 __set_name__ 顺序
python
希和20273 小时前
免费AI视频生成工具汇总(国内优先,适合做漫剧、短视频,Obsidian笔记版)
人工智能·笔记·音视频
天天被压力4 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力4 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A4 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
小lo想吃棒棒糖4 小时前
把机器人训练从 GPU 搬到昇腾 NPU:启元 Q1 起身动作 PPO 训练全记录
python·机器人·昇腾·启元机器人
Thanks_ks5 小时前
【第 006 讲】搭建 PyCharm 开发环境:PyCharm 的下载与安装 | 初始设置与常用配置
ide·python·pycharm·开发工具·jetbrains·开发环境·集成开发环境
青少儿编程课堂6 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
謓泽6 小时前
【插件】用写网页的方式做视频?HyperFrames 让我重新理解了“做视频“这件事!
gpt·ai·大模型·音视频·媒体·claude·视频