音频数据的音量体现为声音的振幅,振幅越大则声音越大,具体到音频帧数据上,体现为声音的绝对值越大则振幅越大音量越大,调节音量大小的本质是调整帧数据的绝对值大小。
在moviepy中,音频数据可以来源于数组、生成数组的函数或FFMPEG音频文件、视频文件等,moviepy中音频的数据会都是没有压缩编码的原始音频帧数据流。音频帧数据体现为一维数组(单声道)或二维数组(双声道),数组中的元素为-1到1之间的浮点数。
音量大小调整就是将原始音频数据的绝对值大小进行调整,moviepy中提供了volumex函数用于方便的进行音量大小调整。
volumex(clip, factor)
volumex的调用方式有四种:
from moviepy.audio.fx.volumex import volumex
volumex(video,2)
for method in [
"afx.audio_fadein",
"afx.audio_fadeout",
"afx.audio_normalize",
"afx.volumex",
"transfx.crossfadein",
"transfx.crossfadeout",
"vfx.crop",
"vfx.fadein",
"vfx.fadeout",
"vfx.invert_colors",
"vfx.loop",
"vfx.margin",
"vfx.mask_and",
"vfx.mask_or",
"vfx.resize",
"vfx.rotate",
"vfx.speedx"
]:
exec("VideoClip.%s = %s" % (method.split('.')[1], method))
for method in ["afx.audio_fadein",
"afx.audio_fadeout",
"afx.audio_loop",
"afx.audio_normalize",
"afx.volumex"
]:
exec("AudioClip.%s = %s" % (method.split('.')[1], method))
将这些函数动态赋值给了VideoClip和AudioClip的同名实例变量,但这些实例变量是在moviepy.editor中定义的,因此在VideoClip或AudioClip的派生子类如VideoFileClip、AudioFileClip中不能这样使用。
import moviepy.audio.fx.all as afx
中将这些函数都加载到了afx模块下,因此可以直接通过afx.函数名方式调用video.fx(volumex,2)
在使用volumex调整音量时,比较理想的音频音量调整方法是,如果是缩小音量就用volumex乘以一个小于1的浮点数,如果是调增音量,则判断当前音频中是否有音频帧达到最大值,如果达到了就不调整,没达到就按最大音量调整到1的方式来设置调整因子factor,这样不会导致音频整体变音严重。
下面介绍老猿想到的几种volumex函数的特例用法:
下面的代码将右声道静音,左声道音量调整为原来的一半:
from moviepy.editor import *
from moviepy.audio.fx.volumex import volumex
if __name__ == '__main__':
audio = AudioFileClip(r"F:\music\slqg.mp3")
#audio = afx.volumex(audio,[0.5,0])
audio = audio.volumex([0.5,0])
audio.write_audiofile(r"f:\music\audio_volumex.mp3")
注释的代码行和其下面的代码行可以相互替换。
更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。
老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。