ffmpeg简易播放器(2)--了解音频格式

news/2025/1/17 16:51:19/文章来源:https://www.cnblogs.com/CrescentWind/p/18677316

声音是个啥

初中物理学过,声音是由物体振动产生的,声音是一种机械波,传播的介质是空气。声音的频率决定了声音的音调,频率越高,音调越高。声音的振幅决定了声音的大小,振幅越大,声音越大。

也就是说,声音实质上是一个连续的信号,他有着频率以及振幅这两个基本属性。而我们的音频文件无非就是记录这两个属性,然后再通过播放器还原出声音。

但是现实中的声音的波形是复杂多样的,他可能是不同频率不同幅值的正弦波的叠加,因此无法简单的用单一的频率和幅值来描述。

采样与采样率

一个简单的思想是将连续的波形离散化,也就是在一定的时间间隔里,取声音波形上的点。这样就可以用一系列的点来描述声音波形了,大概操作如下图。这个操作叫做采样,采样完后在进行量化将其转换为离散量,也就是将连续信号变为离散信号的过程(详见信号与系统,数字信号处理等课程)。
image

我们将采样的频率,也就是一秒钟取多少个样本点,称为采样率。不难看出,相同时间内取的样本点越多,也就是采样率越高,对波形的还原能力就越强。

根据奈奎斯特采样定理,一个信号的最高频率为\(f\),那么他的采样率至少要为\(2f\)时,可以无损失的还原出原信号。知道这个定理即可,若想知道原理也可参考上面两门课程。有奈奎斯特采样定理,以及人类的听觉范围大约为20 - 20000 Hz也就是20Hz - 20KHz之间,低于20Hz或者超过20KHz的声音人类是听不见的。也就是说,只要采样率为人类所能听到的最高频率的两倍就可以保证所有我们能听到的声音都被无损的记录下来也就是20KHz * 2 = 40 KHz,因此一般常见的采样率有44.1KHz,48KHz等,再者可能有更高级别的采样率,比下图网易云的分级有着96KHz甚至于192KHz。

image

量化与量化位数

根据数字信号的定义,时间以及数值上均为离散的信号为离散信号,因此需要采样后将采样点的幅值进行离散化。这个幅值离散化的过程即为量化。

对于音频信号,其频率决定了音调,而幅值决定的便是响度也就是声音的大小。由计算机存储单位可知,一个字节(Byte)拥有8位(bit)可存储的数值范围\(0到2^{8}-1 = 256\),也就是可将声音的幅值分为256个等级。显然使用的存储单元越多,幅值的分级也就越多,声音的还原也就越精确

一般采用2个字节也就是16位的存储空间去作为一个采样点的量化位数,这样可以将声音的幅值分为\(2^{16} = 65536\)个等级,这样的量化位数已经足够用来记录人类能听到的声音了。同时还有着更细的划分比如上图中网易云的24位(24bit)的量化位数。

声道

音频信号的声道数决定了声音的空间位置,也就是声音的立体感。一般常见的声道数有单声道(mono)和双声道(stereo),分别对应着单声道和立体声。双声道的音频文件可以通过左右声道的音量大小来模拟声音的位置。

一般来说,对于双声道的音频文件,假设位深为16bit,那么同一时间点上会有两个16bit的采样点,一个对应左声道,一个对应右声道。存储格式上也是按照(左右)(左右)....这样的顺序进行存储的。大体体现为下面图中interleaved的存储方式。当然也有着另一种存储方式,就是分开存储,可以类比与图片中的通道数,将左右声道单独存储在两个通道中,这种存储方式称为planar存储方式。

image

音频帧

对于音频来说,其一帧的概念起始并不明确。视频的一帧可以非常直观的理解为一张图片。而音频帧的规则指定是由各个标准实现的,比如常见的ACC格式的音频帧大小为1024个采样点,而MP3格式的音频帧大小为1152个采样点。这个音频帧的大小是由编码器决定的,不同的编码器有着不同的音频帧大小。

通过音频帧的规定,我们可以计算出一帧音频的时长。以MP3格式为例,其采样率为44.1KHz,音频帧大小为1152个采样点,那么一帧音频的时长为\(1152 * 1/44100 = 0.026\)秒,也就是26ms。

而一般最常用的格式组合便是44.1KHz,16bit,双声道,这样的音频格式也就是CD音质。可以计算出一秒钟的所需的存储空间为每秒采样数44.1K乘以字节数2乘以声道数2,\(44100 * 2 * 2 = 176400B\),换算一下就是约为172KB。

编码与解码

音频编码与视频编码类似,也是为了减小音频文件的大小。常见的音频编码格式有MP3,AAC,FLAC等。这些编码格式的原理与视频编码类似,都是通过对音频信号的压缩来减小文件的大小。

音频编码的方式有很多种,比如有损编码,无损编码等。有损编码是通过去除一些人耳听不到的声音来减小文件大小,而无损编码则是通过其他方式来减小文件大小,但是不会丢失任何声音信息。常见的有损编码格式有MP3,AAC等,而无损编码格式有FLAC,WAV等。

压缩或者编码后的音频常用码率衡量,码率即为每秒钟的比特数,显然码率是由采样率以及量化位数共同决定的,也就是说,码率越高,音质越好,文件也就越大。常见的码率有128Kbps(CD音质MP3),192Kbps,320Kbps等。也就是一秒钟传输的音频数据量为128Kb,192Kb,320Kb。注意这里的Kb是指Kilobit,数据传输意义上1kb = 1000kb。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870852.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打造高效团队,助力电商实现增长目标

一、电商团队的核心增长目标与痛点 在企业的快速发展中,电商团队作为直接面对市场和消费者的核心部门,承担着推动企业增长的重任。常见的增长目标包括提升销售额、优化转化率、增强品牌影响力等。然而,电商团队在实现这些目标的过程中,往往面临以下挑战: 1. 跨部门沟通成本…

【linux合集】redis集群部署

集群式部署redis 介绍: 三台机器 001、002、003 然后再三台机器上面都部署redis_6379、redis_6380做主从,然后三台机器上面做集群 1、安装/解压redis mkdir -p /data/applications/ wget https://download.redis.io/releases/redis-5.0.14.tar.gz tar -xzf ./redis-5.0.14.ta…

Dockerfile 笔记

目录概述基本结构简单示例示例1示例2构建镜像示例3发布一个自己编写的 centos项目中编写 dockerfile 思路Dockerfile 构建过程Dockerfile 指令FROM - 指定基础镜像MAINTAINER - 指定生成镜像的作者名称WORKDIR - 指定工作目录RUN - 运行指定的命令ADD - 复制文件或者目录到容器…

图标获取、页面设计

当大家在写安卓端及小程序时,是不是在为导航栏的小图标而发愁这里推荐一个网页--即时设计 页面中有很多开源的图标,以及根据选定状态不同的两种形态 选定你所需要的图标,再右下方可以找到图片的导出,大多数情况选择.png格式导出,再移动到自己的项目中,就可以使用啦 图标大…

SendMail Python版

tkinter制作的Python界面 使用前需要设置config.ini的发件人账户 点击 发送之后,对方收到邮件

NOIP邮寄

Day -1 下午出发,一路观察@Acoipp 。图片待会发出来。真服了,如有侵权请私信我。 最左边是基科班学长,左二是lzm (sage NOIP 260+ CSPS 300+ 什么实力不用多说),右二是Acoipp,最右边也是基科班学长。 笑点解析:Acoipp:“我真的想骂人了。”点名表扬BZ电脑,感觉良好!…

Docker Compose 笔记

目录Docker-Compose 简介Docker Compose 的定义和目的Docker-Compose 用来实现 Docker 容器快速编排Docker-Compose 模板文件简介eg:Docker-Compose 的编排处出来的部署架构Docker-Compose 的编排结构安装 Docker-Compose验证Docker-compose是否安装成功卸载docker compose:D…

Regexp for Python

使用PyInstaller打包的Python正则表达式

Ubuntu20.04取消root账号自动登录方法触觉智能RK3568开发板演示

Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估…

库卡机器人示教器维修的参考措施

开课啦!!!“工业机器人维修”之“库卡机器人示教器维修”先来看看这个库卡机器人示教器:1. KUKA 控制屏 (简称“KCP”)是人机交流的接口,它用于简化机器人“KRC”控制部分的操作。所有用于机器人系统编程和操作的部分(除了总开关以外)皆直接布置在 KCP 上。1. KCP 的握把凸…

【UWP】让 UWP 自己托管自己 —— Windows SDK 篇

众所周知,UWP 使用的窗口模型是 CoreWindow,但是 UWP 本身只是一个应用模型,所以完全可以创建 win32 窗口,那么我们可以不可以创建一个 win32 窗口,然后像 XAML 岛 (XAML Islands) 一样把 XAML 托管上去呢?本篇将讲述如何在 UWP 创建一个 XAML 岛窗口。众所周知,UWP 使用…