☞ ░ 前往老猿Python博文目录

一、背景知识介绍

1.1、声音三要素:

  • 音调:人耳对声音高低的感觉称为音调(也叫音频)。音调主要与声波的频率有关。声波的频率高,则音调也高。
  • 音量:也就是响度。人耳对声音强弱的主观感觉称为响度。响度和声波振动的幅度有关。一般说来,声波振动幅度越大则响度也越大。
  • 音色:也就是音品。音色是人们区别具有同样响度、同样音调的两个声音之所以不同的特性,或者说是人耳对各种频率、各种强度的声波的综合反应。音色与声波的振动波形有关,或者说与声音的频谱结构有关。

    更多关于声音三要素的内容请参考《音频基础知识》。

2.1、数字音频常用概念

  1. 采样率(Sample Rate):每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。一般音乐CD的采样率是44100Hz,所以视频编码中的音频采样率保持在这个级别就完全足够了,通常视频转换器也将这个采样率作为默认设置。常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,采样频率越高音质越好,但资源消耗越高。22.05kHz的采样频率是常用的, 44.1kHz已是CD音质, 超过48kHz或96kHz的采样对人耳已经没有意义
  2. 采样位数(Sample Bits):也称采样精度,有点类似颜色表示的位数,指使用数字表示声音信号的数字的二进制位数,位数越多表示声音的精度越高。1 字节(8bit) 只能表示 256 中声音值,2 字节(16bit) 可以表示 65536 个声音值等。采用位数越高声音精度越高,播放的声音与源音的差距越小,但存储开销越大
  3. 通道数(channel):也称为声道数,即声音通道的数目,分为单声道mono;立体声stereo。声道多,效果好,两个声道,说明只有左右两边有声音传过来,四声道,说明前后左右都有声音传过来。moviepy1.03的版本只支持单声道和双声道。
  4. 帧(frame):帧记录了一个声音单元,其长度为样本长度(采样位数)和通道数的乘积
  5. 码率(Bit Rate):也称为位速或比特率,指视频或音频文件在单位时间内使用的数据流量,针对编码格式,表示压缩编码后每秒的音频数据量大小。计算公式:比特率 = 采样率 x 采样位数 x 通道数,单位kbps,这里的k为1000
  6. 块(chunk):一般的音频都是分为若干个块(chunk)保存,每个chunk块包含音频的数据片段和控制信息,可能包含了块的控制信息如块的大小、声道、采样率、位深等信息以及真正的音频数据流(大小由控制头确认)等,不同格式的文件块的控制信息内容不同。在moviepy中处理音频(如保存音频)时,块就是通用的数据块,没有考虑控制信息,通过设定块大小来读写指定大小的数据。

更多关于音频参数的说明请参考《音频基础知识》、《音频 属性详解(涉及采样率、通道数、位数、比特率、帧等)》。

二、AudioClip简介

AudioClip是一个音频剪辑的基类,其父类是Clip。AudioClip带有make_frame属性,该属性根据时间参数t返回一个形如[f_t]或[f_t1,f_t2]的列表,[f_t]、[f_t1,f_t2]分别对应单声道音频numpy数组和立体声音频numpy数组。这些数组的每个元素都是为-1到1之间的浮点数。

老猿理解AudioClip对应的音频帧数据是一个列表,这个列表有如下特征:

1、列表的长度等于音频的通道数,目前仅支持1和2,即单声道和双声道;

2、列表中的元素为-1到1之间的浮点数,其精度与采样位数相关;

3、列表中元素的大小除了表示音调还表征了音量。

三、构造方法

调用语法:

__init__(self, make_frame=None, duration=None, fps=None)

参数说明:
  • make_frame:帧的构建方法,帧的构建方法用于根据时间构建帧,该方法是get_frame获取帧时调用的方法。帧的构建可以从已有剪辑中获取或变换,也可以代码自己填充;
  • duration:音频剪辑的时长
  • fps:这里的fps可以理解为音频的采用率
功能说明:

构造方法用于使用参数同名的实例变量记录参数传入的make_frame、duration和fps,如果make_frame非空则会通过make_frame获取开始位置的音频帧后获取音频的通道数记录到实例变量nchannels属性,如果duration非空,则会同时更新实例变量duration和end。

四、iter_chunks方法

iter_chunks方法返回一个迭代器,通过这个迭代器可以返回一个包含音频剪辑内容块的数组。

调用语法:

iter_chunks(self, chunksize=None, chunk_duration=None, fps=None,quantize=False, nbytes=2, logger=None)

参数说明:
  • chunksize:块的大小
  • chunk_duration:块包含的音频时长,其值不为None时,则chunksize=chunk_duration*fps向下取整,如果chunksize有值也被计算值覆盖
  • fps:块输出的采样频率,如果为None则等于剪辑的fps属性
  • quantize:是否量化处理,如果为True,则将音频帧对应的音频数据进行如下处理:
  1. 将每个元素的大小超出[-0.99,0.99]这个范围的,则大于0.99的被设置为0.99,小于-0.99的被设置为-0.99
  2. 将每个元素的值乘以2的n次方,n的计算方法为:n=采样位数-1采用位数=nbytes*8
  3. 取整返回
  • nbytes:音频采用位数,缺省值为2字节即16位
  • logger:是否开启日志,字符串类型,"bar"表示进度条、None 表示不设置、或任何程序日志记录器的名字

返回的迭代器包含的数据块数=(fps*剪辑的时长)/chunksize+1,这个方法可以在需要对音频剪辑进行变换处理时使用。

五、to_soundarray方法

to_soundarray方法将音频片段转换为一个可以使用pygame播放或者使用wav格式保存的数组。

调用语法:

to_soundarray(self, tt=None, fps=None, quantize=False, nbytes=2, buffersize=50000)

参数说明:
  • tt:为时间浮点数或时间浮点数的列表,用于获取对应时间的音频数据
  • fps:采用频率,如果为None则等于剪辑的fps属性
  • quantize:是否量化处理,请参见iter_chunks方法参数说明
  • nbytes:音频采用位数,缺省值为2字节即16位
  • buffersize:缓冲区大小,从剪辑中转换时,该大小即为处理块的大小

返回值为一个音频数据的np一维数组或二维数组,分别对应tt为时间浮点数或时间浮点数的列表两种情况。如果quantize为False,返回数组的元素为【-1,1】之间的浮点数,否则为整数(请参见iter_chunks方法参数说明)。

六、max_volume方法

max_volume方法是取音频剪辑的最大音量,最大音量也就是音频数组元素绝对值的最大值。

调用语法:max_volume(self, stereo=False, chunksize=50000, logger=None)
说明:
  • stereo:是否立体声,该参数为True且剪辑的声道数为2才会在处理时作为立体声处理,否则作为单声道处理

在老猿的验证环境下,max_volume存在两个BUG,详细的情况请参考《moviepy音视频剪辑:AudioClip的max_volume方法报TypeError: bad operand type for abs(): ‘list‘错》、《moviepy AudioClip的max_volume方法报错ValueError: operands could not be broadcast together with shapes(2,)》的介绍。

七、write_audiofile方法

write_audiofile方法用于将音频剪辑的内容输出到指定文件,该方法替换了低版本的to_audiofile方法。

调用语法:write_audiofile(self, filename, fps=None, nbytes=2, buffersize=2000, codec=None, bitrate=None, ffmpeg_params=None, write_logfile=False, verbose=True, logger='bar')
参数说明:
  • filename:文件名,类型包括文件如mp3、wav、ogg、m4a等都可以
  • fps:帧率,与音频采样率含义相同,每秒编码的帧数,如果为None且音频剪辑设置了fps则以剪辑额的fps属性值作为输出,否则以缺省值44100输出
  • nbytes:音频的采用的位数
  • buffersize:输出缓冲区大小,以该大小作为输出时数据读取块的大小
  • bitrate:码率,音频比特率
  • codec:用于音频编码的编解码器,如果没有指定则系统根据输出文件名类型来确认。默认值为“libmp3lame”,除非视频扩展名为“ogv”或“webm”,在这2种情况下,默认值为“libvorbis”。 如果是16位wav音频设置为 ‘pcm_s16le’、32位wav音频则设置为 ‘pcm_s32le’
  • write_logfile:如果为True,将为音频输出记录日志文件。日志文件将以“.log”结尾,包含输出文件的名称
  • verbose:已经废弃使用,留下来是为了兼容性,以前用于打开/关闭消息。现在使用logger=None。
  • ffmpeg_params:需额外传递的其他ffmpeg参数,用列表传递,形如:[’-option1’,‘value1’,’-option2’,‘value2’]
  • logger:字符串类型,"bar"表示进度条、None 表示不设置、或任何程序日志记录器的名字

更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。

关于收费专栏

本文为免费专栏文章,本文对应收费专栏文章《moviepy音视频开发:音频剪辑基类AudioClip详解》。与本文章内容对比,收费专栏部分文章内容介绍更深入或案例更多。

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学5G!

☞ ░ 前往老猿Python博文目录

moviepy音视频开发:音频剪辑基类AudioClip的更多相关文章

  1. moviepy音视频开发:音频剪辑基类AudioClip详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.背景知识介绍 1.1.声音三要素: 音调:人耳对声音高低的感觉称为音调(也叫音频).音调主要与声波的频率有关.声波的频率高,则音调也高. 音量:也就是响度 ...

  2. Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...

  3. moviepy音视频开发:使用credits1给视频加片头片尾字幕

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip.UpdatedVideoClip.ImageClip. ...

  4. moviepy音视频开发专栏文章目录

    ☞ ░ 前往老猿Python博文目录 ░ <moviepy音视频开发专栏>为收费专栏,基于老猿阅读moviepy1.03版本的源代码以及大量测试验证的基础上,详细介绍moviepy主要音视 ...

  5. moviepy音视频开发:音频合成类CompositeAudioClip介绍

    ☞ ░ 前往老猿Python博文目录 ░ CompositeAudioClip是AudioClip的直接子类,用于将几个音频剪辑合成为一个音频剪辑.CompositeAudioClip类只有一个构造方 ...

  6. Moviepy音视频开发:开发视频转gif动画或jpg图片exe图形化工具的案例

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...

  7. moviepy音视频开发:音频文件存取类AudioFileClip属性和方法介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 AudioFileClip是AudioClip的直接子类,用于从一个音频文件或音频数组中读入音频到内存构建音频剪辑.但AudioFileClip并不 ...

  8. moviepy音视频开发:audio_normalize调整剪辑音量大小到正常

    ☞ ░ 前往老猿Python博文目录 ░ 概述 audio_normalize函数用于将一个剪辑的音量大小调整到正常,调整的思路就是将剪辑中音频帧数据的最大值取出来,当其值小于1时,表示剪辑的音量偏小 ...

  9. moviepy音视频开发:audio_loop实现音频内容循环重复

    ☞ ░ 前往老猿Python博文目录 ░ 概述 moviepy的audio_loop函数用于将音频剪辑内容循环一定次数,返回值是原剪辑内容重复指定次数对应的剪辑. 调用语法: audio_loop(a ...

随机推荐

  1. 【Kata Daily 190916】String end with?(字母结尾)

    题目: Complete the solution so that it returns true if the first argument(string) passed in ends with ...

  2. linux下的终端利器----tmux

    转:tmux 是指通过一个终端登录远程主机并运行后,在其中可以开启多个控制台的终端复用软件.类似GNU Screen,但来自于OpenBSD,采用BSD授权.使用它最直观的好处就是,通过一个终端登录远 ...

  3. 剑指Offer-Python(1-5)

    1.二维数组的查找 查找,其实就可以挨个进行比较就可以.又由于题目说明(每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序),因此如果利用类似于二分查找的方法,那么比较次数则会更少 ...

  4. linux nf_conntrack 连接跟踪机制

    PRE_ROUTING和LOCAL_OUT点可以看作是整个netfilter的入口,而POST_ROUTING和LOCAL_IN可以看作是其出口; 报文到本地:PRE_ROUTING----LOCAL ...

  5. 命名管道FIFO及其读写规则

    一.匿名管道的一个限制就是只能在具有共同祖先的进程间通信命名管道(FIFO):如果我们想在不相关的进程之间切换数据,可以使用FIFO文件来做这项工作注意:命名管道是一种特殊类型文件.利用命令:$ mk ...

  6. vue 切换主题(换肤)功能

    一:先写好两个css样式放在static文件夹中 二:在index.html中添加css link链接 <link rel="stylesheet" id="sty ...

  7. JavaScript高级程序设计(第四版) -- 随笔 -- 数组(未完)

    数组方法 .every() 与 .some() 传给两个个方法的函数都接收3个参数:数组元素.元素索引和数组本身. .every() -- 对于每一项都需要返回true,它才会返回true 若中途有一 ...

  8. 我要进大厂之大数据Hadoop HDFS知识点(1)

    01 我们一起学大数据 老刘今天开始了大数据Hadoop知识点的复习,Hadoop包含三个模块,这次先分享出Hadoop中的HDFS模块的基础知识点,也算是对今天复习的内容进行一次总结,希望能够给想学 ...

  9. 防sql注入函数

  10. 深度分析:面试腾讯,阿里面试官都喜欢问的String源码,看完你学会了吗?

    前言 最近花了两天时间,整理了一下String的源码.这个整理并不全面但是也涵盖了大部分Spring源码中的方法.后续如果有时间还会将剩余的未整理的方法更新到这篇文章中.方便以后的复习和面试使用.如果 ...