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

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

相关推荐
cd988801 分钟前
2026年,电销机器人哪家技术强?
python
weixin199701080162 分钟前
[特殊字符] 1688开放平台API Sign签名算法详解(Java / Python / PHP 实现)
java·python·算法
TickDB28 分钟前
Python 调用实时行情 API:ticker 返回成功后,如何校验字段再入库或展示
python·websocket·行情数据 api
AC赳赳老秦35 分钟前
OpenClaw 助力技术面试:自动生成面试题、模拟面试、整理面试知识点
开发语言·python·面试·职场和发展·自动化·deepseek·openclaw
Hali_Botebie40 分钟前
PyTorch 2.x核心变革torch.compile(),Triton 是其中最重要的 kernel 生成方式之一
人工智能·pytorch·python
EasyDSS44 分钟前
私有化音视频系统/视频直播点播EasyDSS一站式视频平台重构企业全域数字化协作
重构·音视频
我登哥MVP1 小时前
VS Code 安装 Claude Code 并接入 DeepSeek V4 Model
人工智能·python·node.js·agent·codex·deepseek·claude code
ai产品老杨1 小时前
解耦视频高并发与边缘计算AI布控:基于Docker的高性能安防平台,破局GB28181/RTSP协议兼容与源码交付痛点
人工智能·音视频·边缘计算
AI行业学习1 小时前
CC‑Switch v3.16.1-下载、配置、安装(2026‑06‑01 最新官方版)
开发语言·人工智能·windows·python
unity工具人1 小时前
python+yolov8 图像识别-测试案例
python·opencv·yolo