使用Python第三方库pydub按一定bitrate,frame_rate压缩音频文件
安装pydub
pip install pydub
注: pydub支持wav格式音频读取,本文处理的是MP3格式,所以需要安装ffmpeg.
Linux下安装ffmpeg
sudo apt install ffmpeg
读取、压缩MP3格式文件
from pydub import AudioSegment
# 音频文件路径
path = "file's path"
# 读取音频文件,设置采样率<default=44100>
song = AudioSegment.from_mp3(path).set_frame_rate(22050)
# 按32k的bitrate导出文件到指定路径,这里是直接覆盖原文件
song.export(path, format='mp3', bitrate='32k')
扩展
"""
pydub提供了对mp3, wav, ogg, flv等格式的音频文件的支持,
对应有from_mp3, from_wav, from_ogg, from_flv等Classmethod;
支持设置sample_width, frame_rate, channels,
值得注意的是在AudioSegment初始化时,不可设置单个特征值,否则会报以下错误:
pydub.exceptions.MissingAudioParameter: Either all audio parameters or no parameter must be specified
对应的提供了设置单个特征值的方法:set_frame_rate, set_sample_width, set_channels;
"""
# pydub的源码相对简单, 下面是此次运用的两个方法的源代码:def export(self, out_f=None, format='mp3', codec=None, bitrate=None,parameters=None, tags=None, id3v2_version='4', cover=None):"""Export an AudioSegment to a file with given optionsout_f (string):Path to destination audio file. Also accepts os.PathLike objects onpython >= 3.6format (string)Format for destination audio file.('mp3', 'wav', 'raw', 'ogg' or other ffmpeg/avconv supported files)codec (string)Codec used to encoding for the destination.bitrate (string)Bitrate used when encoding destination file. (64, 92, 128, 256, 312k...)Each codec accepts different bitrate arguments so take a look at theffmpeg documentation for details (bitrate usually shown as -b, -ba or-a:b).parameters (string)Aditional ffmpeg/avconv parameterstags (dict)Set metadata information to destination filesusually used as tags. ({title='Song Title', artist='Song Artist'})id3v2_version (string)Set ID3v2 version for tags. (default: '4')cover (file)Set cover for audio file from image file. (png or jpg)"""passdef set_frame_rate(self, frame_rate): # default: frame_rate=44100if frame_rate == self.frame_rate:return selfif self._data:converted, _ = audioop.ratecv(self._data, self.sample_width,self.channels, self.frame_rate,frame_rate, None)else:converted = self._datareturn self._spawn(data=converted,overrides={'frame_rate': frame_rate})
pydub对音频文件的处理是是磁盘IO操作,耗时较长,在web应用中建议做异步后台处理,笔者使用的是django框架做后台开发, django提供有django-rq和django_celery支持异步操作,关于celery和django_rq的使用在笔者其他文章中有所介绍。