【音视频处理】为什么MP3不是无损音乐?音频参数详解,码率、采样率、音频帧、位深度、声道、编码格式的关系

大家好,欢迎来到停止重构的频道。
上期我们讨论了视频的相关概念,本期我们讨论音频的相关概念。
包括采样率、码率、单双声道、音频帧、编码格式等概念。
这里先抛出一个关于无损音频的问题。
为什么48KHz采样率的.mp3不是无损音乐 ,而48KHz采样率的.wav、.flac音频是无损的呢?
音频相关概念我们按这样的顺序分类讨论:
1、 音频采样的概念
2、 单个音频帧的概念
3、 多个音频帧的概念
音频采样的概念
相关概念有:采样、位深度、声道、采样率。
与视频不同的是,音频的最小单位不是一帧,而是一个采样。
采样是当前一刻声音的声音样本,样本需要经过数字转换才能存储为样本数据。

数字转换时会根据位深度转换,位深度就是存储单个样本数据的大小,位深度越大,记录的样本数据精度就越高。
网络视频、音频文件一般位深度为16bit,常用位深度还有8bit、24bit等。
这里需要一提的是,位深度越大虽然意味着声音还原度越高,但是过高的位深度,如32bit、64bit float或以上,可能需要特殊的软件和硬件设备才能播放。

接下来是声道,音频有单声道、双声道、立体声等。
每个声道的声音样本都会单独记录,一般双声道的采样数是单声道的两倍,多声道同理。
多个声道的样本数据一般会按声道排列顺序记录,播放时,程序会根据排列顺序将声音用不同的扬声器播放。

而采样率是采样的频率,与视频的帧率类似,是一秒钟对声音的采样个数,如果是双声道,那么1秒采样的个数是采样率的两倍,多声道同理。
普遍认为,流畅且不失真的音频,要求采样率达到40KHz以上,这个采样率是人类听觉频率上限的两倍,一般CD品质音频的采样率是44.1KHz,网络视频、视频文件一般是48KHz。

不过,某些具体场景可能会降低采样率要求,如语音通话、监控摄像头等,这些场景下,音频采样率一般只有8KHz,这个频率虽然听音乐是一种折磨,会一卡一卡的,但是对听清别人说话倒是一点问题没有。
单个音频帧的概念
这里我们理解为什么存在音频帧就可以了。
理论上,音频并不需要音频帧的概念,因为音频采样数据和采样率已经可以把音频播放描述清楚了。
但是音视频文件播放时,为了保证音视频同步,程序需要根据每帧的播放时间戳进行有序播放。
但是每个音频采样数据太小了,如果每个采样数据都记录播放时间戳的话,那么就得不偿失了。毕竟一个时间戳数据的大小比一个音频采样数据都大,所以就有了音频帧的概念。
音频帧实际上就是把一小段时间的音频采样数据打包起来,如每20ms的音频采样数据合并成一帧。
这里的具体时间间隔是具体编码码格式决定的,一般不需要特别关心。

多个音频帧的概念
多个音频帧的概念有播放时间戳PTS、码率、编码格式。与
视频帧一样,每一帧音频帧也会记录播放时间戳PTS,程序播放时会根据播放时间戳PTS播放音频帧。
音频帧的播放是比较特别的,因为一帧音频包含的是一小段时间的音频采样,所以实际上音频帧的播放时间戳只是这一小段音频的开始播放时间,里面的采样数据会根据采样频率连续播放。

同时音频也有码率,也就是常听到的音频比特率,码率就是一秒钟的数据量大小。
在不压缩的情况下,音频码率的大小=采样率*位深度声*道数。

接下来是编码格式,编码格式实际上是压缩数据的方式,常用的编码格式有wav、mp3、aac等,音频编码格式有有损、无损压缩之分。

这里可以解释开篇的问题了,为什么采样参数相同的mp3和wav文件会有不同的音质,这实际上是编码格式的问题。
mp3、aac这些编码格式是有损压缩,其中mp3支持的最大码率是320Kbps,而wav编码格式是无损压缩,虽然压缩后的码率可能会比降低,但是它在播放时能无损还原采样数据。
最后值得一提的是,在网络音频文件、音频直播时,需要考虑限制码率,限制码率的目的是为了限制数据量的大小,避免带宽、流量等问题。
音频编码格式一般采用aac,音频码率一般设置为128Kbps就可以了。
总结
以上是音频的基础概念,音频在很多介绍中都不会说到音频帧,因为普通的视频编辑场景是用不到的,但是在音视频处理中音频帧的概念是十分重要的,不然会出现很多问题,如音频重编码重采样后,出现卡顿、音频播放过快等问题。
介绍完了音频和视频的基础概念,后面我们会介绍关于音视频处理、识别的一些软件和框架。
相关文章:

【音视频处理】为什么MP3不是无损音乐?音频参数详解,码率、采样率、音频帧、位深度、声道、编码格式的关系
大家好,欢迎来到停止重构的频道。上期我们讨论了视频的相关概念,本期我们讨论音频的相关概念。包括采样率、码率、单双声道、音频帧、编码格式等概念。这里先抛出一个关于无损音频的问题。为什么48KHz采样率的.mp3不是无损音乐 ,而48KHz采样率…...
Linux 环境变量
Linux 环境变量能帮你提升 Linux shell 体验。很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息。在 Linux 系统上有很多地方可以设置环境变量,了解去哪里设置相应的环境变量很重要。 认识环境变量 bash shell 用环境变量(environme…...

从功能测试(点点点)到进阶自动化测试,实现薪资翻倍我只用了3个月时间
前言 从事测试工作已3年有余了,今天想聊一下自己刚入门时和现在的今昔对比,虽然现在也没什么成就,只能说笑谈一下自己的测试生涯,各位看官就当是茶余饭后的吐槽吧,另外也想写一写自己的职场感想,希望对刚开…...
aspnetcore 原生 DI 实现基于 key 的服务获取
你可能想通过一个字符串或者其他的类型来获取一个具体的服务实现,那么在 aspnetcore 原生的 MSDI 中,如何实现呢?本文将介绍如何通过自定义工厂来实现。我们现在恰好有基于 Json 和 MessagePack 的两种序列化器有一个接口是这样的publicinter…...
华为OD机试 -最大子矩阵和(Python) | 机试题+算法思路+考点+代码解析 【2023】
最大子矩阵和 题目 给定一个二维整数矩阵 要在这个矩阵中 选出一个子矩阵 使得这个子矩阵内所有的数字和尽量大 我们把这个子矩阵成为“和最大子矩阵” 子矩阵的选取原则,是原矩阵中一段相互连续的矩形区域 输入 输入的第一行包含两个整数N,M (1 <= N,M <= 10) 表示…...
C2驾照科一学习资料(1)
目录 记1分 记3分 记6分 记9分 记12分 你有不伤别人的教养 却缺少一种不被人伤的气场 若没人护你周全 就请善良中带点锋芒为自己保驾护航 这个世界你若好到毫无保留 对方就会坏到肆无忌惮 记1分 《道路交通安全违法行为记分管理办法》规定,机动车驾驶人有下列…...
4576: 移动数组元素
描述给定一个n个元素的一维数组,将下标从0到p的元素全部平移到数组尾部。输入第一行有两个正整数n和p(2<n<100,0<p<n)。第二行有n个整数,表示数组的各个元素。输出在一行中按顺序输出移动后的各个数组元素…...

字符串中<br>处理
需求: 后端返回的字符串中带有br换行符,前端需要处理行内及行尾的换行符。具体需求可分为以下两个: 若是字符串末尾有换行符,需要去掉。若是字符串内有换行符,有两种需求:①将换行符转换成逗号或其它符号&…...
大数据技术原理与应用介绍
大数据技术原理与应用 概述 大数据不仅仅是数据的“大量化”,而是包含“快速化”、“多样化”和“价值化”等多重属性。 两大核心技术:分布式存储和分布式处理 大数据计算模式 批处理计算流计算图计算查询分析计算 大数据具有数据量大、数据类型繁…...

【Python】序列与列表(列表元素的增删改查,求之,列表推导式、列表的拷贝)
一、序列序列的概念:按照某种顺序排列的数据类型就叫做序列,比如字符串,列表,元组,集合序列的共同点是都有下标,支持index()方法和count(),也支持切片处理(等同于字符串序列的切片处理)l1 [0, …...
update导致死锁
update delete 操作,如果走的索引,对索引和主键索引加行锁 如果没有走索引,锁整张表。 不开启事务,mysql本身也会加锁 一般MYSQL在执行CREATE,ALTER,INSERT等命令时会自动加锁 在对数据进行更新操作时 如果update没用到索引&…...

Java 集合 --- 如何遍历Map
Java 集合 --- 如何遍历MapMap的基本操作如何遍历MapType of HashMapMap没有继承Collection接口AbstractMap和AbstractCollection是平级关系 Map的基本操作 package map; import java.util.*; /*** This program demonstrates the use of a map with key type String and val…...

C#从值类型、引用类型到装箱和拆箱
上一篇文章讲了C#的值类型和引用类型,这里再来看看值类型和引用类型最直接的使用场景:装箱和拆箱。 一、基本概念 装箱:值类型转化为引用类型的过程。从托管堆中为新生成的引用类型对象分配内存,再把值类型的实例字段拷贝到托管堆上新对象的…...
Java中的逻辑运算符/移位运算符简单总结
前段时间刷到了力扣关于位运算的题,这里浅浅记录一下! 1. 逻辑位运算 1.1 与 & &:按位与进行二进制计算,规则是同为1则为1,不同为0,具体如下: 0&00, 0&10, 1&00, 1&…...

活动预告 | GAIDC 全球人工智能开发者先锋大会
大会主题——“向光而行的 AI 开发者” 2023 全球人工智能开发者先锋大会(GAIDC) 由世界人工智能大会组委会、上海市经济和信息化委员会、上海市人才工作领导小组办公室及中国(上海)自由贸易试验区临港新片区管理委员会指导&…...

【Linux系统】认识操作系统和操作系统如何进行管理以及进程相关状态
进程概念1 认识冯诺依曼体系结构1.1 冯诺依曼体系结构存储器的作用2 操作系统(Operator System,OS)2.1 OS如何进行管理3 进程3.1 OS管理进程:先描述再组织3.2 描述进程-PCB3.3 查看进程3.4 通过系统调用获取进程标识符3.5 通过系统调用创建子进程——for…...

【0基础学爬虫】爬虫基础之HTTP协议的基本原理介绍
大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学…...
SpringBoot 整合定时任务
注解概览 EnableScheduling 在配置类上使用,开启计划任务的支持(类上) Scheduled 来申明这是一个任务,包括cron,fixDelay,fixRate等类型(方法上,需先开启计划任务的支持) pom依赖 <parent…...

我的零分周赛:CSDN周赛第30期,成绩“0”分,天然气定单、小艺读书、买苹果、圆桌
CSDN周赛第30期,成绩“0”分,天然气定单、小艺读书、买苹果🍎、圆桌。 (本文获得CSDN质量评分【91】)【学习的细节是欢悦的历程】Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教…...

二、Java虚拟机的基本结构
Java虚拟机的架构1.内存结果概述2.类加载器子系统的作用3. 类加载器ClassLoader角色4.类的加载过程5.类加载器的分类1.引导类加载器(虚拟机自带的加载器)Bootstrap ClassLoader2.扩展类加载器(虚拟机自带的加载器) Extenssion ClassLoader3.应用程序类加载器(虚拟机自带的加载器…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...