音频格式、参数、开发相关总结

news2024/12/24 8:42:03

常见的语音格式介绍

  • PCM:音频纯裸数据。

  • WAV:微软在windows存储的一种纯裸数据格式。

  • AIFF:苹果在Mac上存储的一种纯裸数据格式。

  • MP3:为ISO/IEC国际标准,是现在最普及的一种数字音频编码和有损压缩格式,几乎所有的终端和软件都支持此格式。mp3既是一种封装格式,又是一种音频编解码类型。

  • G.711:是一种由国际电信联盟(ITU-T)制定的音频编码方式,又称为ITU-T G.711。它是国际电信联盟ITU-T定制出来的一套语音压缩标准,它代表了对数PCM(logarithmic pulse-code modulation)抽样标准,主要用于电话、在安防监控领域也长涉及。

  • AAC:(Advanced Audio Coding),中文名:高级音频编码,出现于1997年,基于MPEG-2的音频编码技术。在互联网直播场景下经常用于RTMP协议中传输音频。

  • OPUS:是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由IETF(互联网工程任务组)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的即时声音传输,标准格式定义于RFC 6716文件。在webrtc中常用。

主要的音频参数介绍

  • 采样率:8000 Hz(8K Hz)、16000 Hz (16K Hz),即每秒8000个或16000个采样点。

  • 声道:Mono单声道;Stereo立体声。

声道名称

Mono单声道

Stereo立体声

2.1

4.0

4.1

5.1

7.1

声道数量

1

2

3

4

5

6

8

  • 采样位数:如16bit表示每个采样点的音频信息用16 bit(2个字节)保存。取值范围8bit、16 bit、32bit,有符号、无符号、浮点、double等。

从Adobe Audition的截图看,各参数的展示:

语音时长与文件大小转换:语音文件Size大小(单位MiB)=

(采样率×采样位数×声道数×语音时长(单位s))/(8*1024*1024)=16000(Hz)*16(bit)*1(声道)*60(s)/(8*1024*1024)=1.83 MiB(近似值)

对应ffmpeg中的主要结构体

  • sample_rate:对应采样率

# libavutil/frame.h
/**
 * Sample rate of the audio data.
 */
int sample_rate;
  • nb_samples:定义在frame.h中,表示一帧frame中包含的采样点数。

举例:如音频采样率16k单声道,每10ms传输一帧frame,那么该frame中nb_samples=16000/1000ms*10ms=160个采样点。

# libavutil/frame.h
/**
 * number of audio samples (per channel) described by this frame
 */
int nb_samples;
  • nb_channels:对应声道数

 * @param nb_channels   the number of channels
  • AVSampleFormat :对应采样位数(位深度),根据数据类型、占用bit位数、存储方式三个方面命名。

举例:AV_SAMPLE_FMT_S32P,其中后缀S32P的意思是:signed格式 、32 bits位数、planar模式。

# libavutil/samplefmt.h
enum AVSampleFormat {
    AV_SAMPLE_FMT_NONE = -1,
    AV_SAMPLE_FMT_U8,          ///< unsigned 8 bits
    AV_SAMPLE_FMT_S16,         ///< signed 16 bits
    AV_SAMPLE_FMT_S32,         ///< signed 32 bits
    AV_SAMPLE_FMT_FLT,         ///< float
    AV_SAMPLE_FMT_DBL,         ///< double

    AV_SAMPLE_FMT_U8P,         ///< unsigned 8 bits, planar
    AV_SAMPLE_FMT_S16P,        ///< signed 16 bits, planar
    AV_SAMPLE_FMT_S32P,        ///< signed 32 bits, planar
    AV_SAMPLE_FMT_FLTP,        ///< float, planar
    AV_SAMPLE_FMT_DBLP,        ///< double, planar
    AV_SAMPLE_FMT_S64,         ///< signed 64 bits
    AV_SAMPLE_FMT_S64P,        ///< signed 64 bits, planar

    AV_SAMPLE_FMT_NB           ///< Number of sample formats. DO NOT USE if linking dynamically
};

# libavutil/samplefmt.c
/** this table gives more information about formats */
static const SampleFmtInfo sample_fmt_info[AV_SAMPLE_FMT_NB] = {
    [AV_SAMPLE_FMT_U8] = {.name = "u8",
                          .bits = 8,
                          .planar = 0,
                          .altform = AV_SAMPLE_FMT_U8P},
    [AV_SAMPLE_FMT_S16] = {.name = "s16",
                           .bits = 16,
                           .planar = 0,
                           .altform = AV_SAMPLE_FMT_S16P},
    [AV_SAMPLE_FMT_S32] = {.name = "s32",
                           .bits = 32,
                           .planar = 0,
                           .altform = AV_SAMPLE_FMT_S32P},
    [AV_SAMPLE_FMT_S64] = {.name = "s64",
                           .bits = 64,
                           .planar = 0,
                           .altform = AV_SAMPLE_FMT_S64P},
    [AV_SAMPLE_FMT_FLT] = {.name = "flt",
                           .bits = 32,
                           .planar = 0,
                           .altform = AV_SAMPLE_FMT_FLTP},
    [AV_SAMPLE_FMT_DBL] = {.name = "dbl",
                           .bits = 64,
                           .planar = 0,
                           .altform = AV_SAMPLE_FMT_DBLP},
    [AV_SAMPLE_FMT_U8P] = {.name = "u8p",
                           .bits = 8,
                           .planar = 1,
                           .altform = AV_SAMPLE_FMT_U8},
    [AV_SAMPLE_FMT_S16P] = {.name = "s16p",
                            .bits = 16,
                            .planar = 1,
                            .altform = AV_SAMPLE_FMT_S16},
    [AV_SAMPLE_FMT_S32P] = {.name = "s32p",
                            .bits = 32,
                            .planar = 1,
                            .altform = AV_SAMPLE_FMT_S32},
    [AV_SAMPLE_FMT_S64P] = {.name = "s64p",
                            .bits = 64,
                            .planar = 1,
                            .altform = AV_SAMPLE_FMT_S64},
    [AV_SAMPLE_FMT_FLTP] = {.name = "fltp",
                            .bits = 32,
                            .planar = 1,
                            .altform = AV_SAMPLE_FMT_FLT},
    [AV_SAMPLE_FMT_DBLP] = {.name = "dblp",
                            .bits = 64,
                            .planar = 1,
                            .altform = AV_SAMPLE_FMT_DBL},
};

  • 关于mp3相关研发,参考:ffmpeg转换mp3的实现

  • 关于AAC的传输头ADTS协议,参考:AAC的ADTS头文件信息介绍

参考文档:

  • 详细音频格式,可参考:https://www.nxrte.com/jishu/5391.html

https://blog.csdn.net/CrystalShaw/article/details/122258059

https://www.jianshu.com/p/85d083fb2615

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Spider XX兔 Wechat Cookie 校验 注册案例(二)

声明 此次案例只为学习交流使用&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;切勿用于其他非法用途&#xff1b; 文章目录声明前言一、资源推荐二、任务说明三、App抓包分析四、还原JS加密1、Date类2、MD5类3、组合调用还原 api_token 参数4、execjs模…

04- 图像卷积及图片的模糊和边缘检测 (OpenCV基础) (机器视觉)

知识重点 padding指的就是填充的0的圈数重构图片大小: img cv2.resize(img, dsize(300, 300))模糊操作: dst cv2.filter2D(img, -1, kernel) kernel np.ones((5, 5), np.float32)/ 25 dst cv2.filter2D(img, -1, kernel) # 卷积操作 模糊操作: 方盒滤波: dst cv2.b…

AD使用教程 图文并茂 AD2020四层板

文章目录设计流程图&#xff1a;资源下载&#xff1a;自定义快捷键&#xff1a;&#xff08;按照个人习惯&#xff09;默认快捷键&#xff1a;一、软件主页面1.主界面2.Panels面板3.系统设置3.自定义快捷键4.新建工程二、原理图库1.原理图库面板2.管脚属性三、原理图绘制绘制步…

C++011-C++循环+枚举

文章目录C011-C循环枚举枚举枚举思想枚举举例题目描述 统计因数题目描述 质数判定错误方法一&#xff1a;优化方法1&#xff1a; 用break实现优化优化方法2&#xff1a; sqrt(n)题目描述 水仙花数题目描述 7744问题实现方法1优化方法2题目描述 余数相同问题题目描述 特殊自然数…

《第一行代码》 第六章:数据库与存储方案

一&#xff0c;持久化技术简介 也就是数据存储在内存中&#xff0c;会丢失。需要存储在存储设备中。而持久化技术&#xff0c;就是提供了手段&#xff0c;让数据再试瞬时状态和持久状态之间转换。 安卓开发提供了三种数据的持久化技术&#xff1a; 二&#xff0c;文件存储 …

【HDFS】FsDatasetImpl#getReplicaVisibleLength

调用点 DataNode.getReplicaVisibleLength(ExtendedBlock) (org.apache.hadoop.hdfs.server.datanode) // ClientDataNodeProtocolBlockChecksumComputer in BlockChecksumHelper.BlockChecksumComputer(DataNode, ExtendedBlock, BlockChecksumOptions) (org.apache.hadoop.hd…

ros中时间的概念:ros::Time、ros::Duration、定时器ros::Timerros::Rate、ros::WallTime

1. ros时间格式说明 有时刻和持续时长(可以是负数)&#xff0c;分为秒和纳秒&#xff0c;换算关系&#xff1a;1sec1e9nsec。Time指的是某个时刻&#xff0c;而Duration指的是某个时段。 int32 sec int32 nsec 2. ros::Time::now() 记录当前时刻 3. ros::Duration 代表持续的…

Linux 输出重定向 “>”、“>>”、“freopen”

有时候&#xff0c;我们编码时会使用printf或fprintf去打印输出调试信息或者报错信息&#xff0c;但正常这样去打印&#xff0c;只会显示在终端&#xff0c;如果终端关闭了&#xff0c;或者系统宕机了等&#xff0c;这些输出信息就没有了&#xff0c;为了将这些重要的信息保存下…

java诊断与调优常用命令jmap、jstack、jstat使用实战

java应用运行过程中难免会出现问题&#xff0c;特别是在生产环境&#xff0c;发生异常或宕机情况&#xff0c;需要诊断与分析&#xff0c;定位原因&#xff0c;进行优化&#xff0c;避免下次再次出现问题。 虽然现在有很多可视化工具&#xff0c;使用起来比命令行更方便&#x…

开学季好用电容笔有哪些?好用实惠的电容笔推荐

随着科学技术的快速发展&#xff0c;ipad的影响力越来越大&#xff0c;而且ipad的用户也越来越多&#xff0c;如果要提高ipad的功能&#xff0c;让ipad更加有趣&#xff0c;那么就需要一款非常适合自己&#xff0c;并且非常实用的电容笔。那么&#xff0c;究竟该选择哪个品牌的…

SpringBoot整合分布式锁redisson

1、导入maven坐标<!-- 用redisson作为所有分布式锁&#xff0c;分布式对象等功能框架--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.5</version></dependency>2、red…

蓝牙 - BLE中的连接和扫描参数设定

连接参数 / Connection Parameters 连接参数由发起设备与连接请求一起发送&#xff0c;当连接建立后&#xff0c;任何一个设备都可以修改。这些参数如下&#xff1a; 连接间隔 / Connection Interval 在低功耗蓝牙连接中&#xff0c;使用了跳频方案。两台设备发送各自数据和接…

day48【代码随想录】动态规划之最长递增子序列、最长连续递增序列、最长重复子数组

文章目录前言一、最长递增子序列&#xff08;力扣300&#xff09;二、最长连续递增序列&#xff08;力扣674&#xff09;三、最长重复子数组&#xff08;力扣718&#xff09;前言 1、最长递增子序列 2、最长连续递增序列 3、最长重复子数组 一、最长递增子序列&#xff08;力扣…

rocketmq延时消息自定义配置;topic下tag使用

概述 使用的是开源版本的rocketmq4.9.4 rocketmq也是支持延时消息的。 rocketmq一般是4个部分&#xff1a; nameserver&#xff1a;保存路由信息broker&#xff1a;保存消息生产者&#xff1a;生产消息消费者&#xff1a;消费消息 延时消息的处理是在其中的broker中。 但是…

我为什么放弃WinUI3

基于WinUI3开发HiNote已经有一个多月的时间了&#xff0c;算是做出来一个简单能用的C端软件。 基于个人的经历&#xff0c;说说其中的开发体验。 UI设计语言 无论是否抄袭苹果&#xff0c;WinUI3给人的感觉都是眼前一亮的。简洁美观&#xff0c;现代化&#xff0c;毛玻璃的美…

rk3568网口CAN串口通信速率性能

通信接口性能参数外设接口性能参数测试结果为实验室实测值&#xff0c;可作为设计参考&#xff0c;但因测试环境和器件批次差异&#xff0c;可能会存在一定的误差&#xff0c;且测试结果依赖评估板性能&#xff0c;核心板搭配不同底板性能也可能存在差异&#xff0c;请结合实际…

Redis之分布式锁

随着业务发展的需要&#xff0c;原单体单机部署的系统被演化成分布式集群系统后&#xff0c;由于分布式系统多线程、多进程并且分布在不同机器上&#xff0c;这将使原单机部署情况下的并发控制锁策略失效&#xff0c;单纯的 Java API并不能提供分布式锁的能力。为了解决这个问题…

Java:顶级Java应用程序服务器 — Tomcat、Jetty、GlassFish、WildFly

如果你想编写Java web应用程序&#xff0c;首先需要做出一个艰难的决定&#xff1a;选择运行应用程序的Java应用程序服务器。什么是应用服务器?一般来说&#xff0c;应用程序服务器执行Java应用程序。在操作系统中启动它们&#xff0c;然后将应用程序部署到其中。将应用程序服…

盘点2023年大企业都在用的优秀项目管理软件

行内有句话&#xff1a;每个成功的项目背后肯定有一个成功的项目经理&#xff0c;而每个项目经理背后都少不了一些专业的项目管理工具。要在任何项目中取得成功&#xff0c;对项目进行全面的管理非常关键&#xff0c;包括项目的执行、计划、推进、监控、结果等&#xff0c;有了…

谈谈我对ai发展的看法

最近难得有时间&#xff0c;通过白话&#xff0c;聊聊我对AI的看法&#xff0c;仅代表个人观点首先表明我的观点&#xff1a;人类当前的人工智能成果&#xff0c;仍然停留在一知半解程度。技术的发展是需要长期的积累和进步&#xff0c;目前AI的发展仍处于入门阶段人类的发展必…