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

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

相关推荐
VidDown3 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
死磕音视频5 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林5 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
美狐美颜SDK开放平台6 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
光锥智能7 小时前
价格从“元”降到“分”,AI视频的下半场开打了
人工智能·音视频
pride.li7 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook7 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python
康小旺7 小时前
把 markitdown 做成 Windows 桌面版:拖进文档就出 Markdown,附 233MB→64MB 打包裁剪全过程
python
启观川8 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
南笙北梦8 小时前
本地开源大模型多轮对话显存泄漏排查与修复实录
python