源代码分析
代码目录结构
- pydub
- __init__.py #引入AudioSegment
- audio_segment.py
- effects.py
- exceptions.py
- generators.py
- logging_utils.py #日志
- playback.py
- pyaudioop.py
- scipy_effects.py
- silence.py
- utils.py #工具
- audio_segment.py详解
使用方法
打开一个音频文件
打开WAV文件
from pydub import AudioSegment song = AudioSegment.from_wav("never_gonna_give_you_up.wav")
或mp3
song = AudioSegment.from_mp3("never_gonna_give_you_up.mp3")
或ogg,flv或ffmpeg支持的任何其他东西
ogg_version = AudioSegment.from_ogg("never_gonna_give_you_up.ogg") flv_version = AudioSegment.from_flv("never_gonna_give_you_up.flv") mp4_version = AudioSegment.from_file("never_gonna_give_you_up.mp4", "mp4") wma_version = AudioSegment.from_file("never_gonna_give_you_up.wma", "wma") aac_version = AudioSegment.from_file("never_gonna_give_you_up.aiff", "aac")
音频切片
# pydub以毫秒为单位工作
ten_seconds = 10 * 1000
first_10_seconds = song[:ten_seconds]
last_5_seconds = song[-5000:]
放大开头音量,减小结尾音量
# 放大6dB音量
beginning = first_10_seconds + 6
# 衰减3dB音量
end = last_5_seconds - 3
连接音频(将一个文件添加到另一个文件的末尾)
without_the_middle = beginning + end
交叉淡化(开头和结束不修改)
with_style = beginning.append(end, crossfade = 1500)
重复
#重复剪辑两次
do_it_over = with_style * 2
淡出(注意,你可以链接操作,因为一切返回一个AudioSegment)
# 2秒的淡入,3秒的淡出
awesome = do_it_over.fade_in( 2000).fade_out( 3000)
保存结果(可能需要ffmpeg)
awesome.export(“ mashup.mp3 ”,format = “ mp3 ”)
补充知识
关于数字音频的采样精度(bit-depth)
音频的一个采样用几个bit来表示,叫采样精度,又叫位深(bit-depth)。我们常用的位深是16bit,也就是16bit表达一个采样,这样,最高信噪比可以表示为20log(2^16)=96db,而用24bit位深的话,最高信噪比可以到达20log(2^24)=144db。
专业的数字音频处理软件内部其实都是用float型来表示一个采样,也就是32bit,那么最高信噪比可以达到193db,这个信噪比已经非常高了。
我们需要达到的目标,比如达到业界vivo的codec cs4398信噪比120db,这个只需要24bit就能在理论上提供了可行性。
对于MP3等有损格式,无论压缩前的pcm数据是24bit还是16bit的,压缩过程中都会尽量使用最小bit-depth来存储数据,因此解码时的bit-depth理论上时没有意义的。但是工程上讲,使用24bit解码器的mp3,解码时进行加减乘除运算的精度变大,从而能提高一些信噪比。
为了方便处理,通常会把24bit放入一个32bit int,怎么放呢?跟容器类型和机器大小端有关系。
比如WAV容器,它存储是小端的,这样,存储0xAABBCC这个24bit的采样就需要存成:
CC BB AA (—地址从低到高—>)
为了转化为 int32_t 进行处理,需要把它的高位填充到一个 int32_t 型数中的高位,而最低 8位补零,最终得到 0xAABBCC00 。由于arm 也是小端的,内存中应该是这样的布局:
00 CC BB AA (—地址从低到高—>)