音视频开发基础概述 - PCM、YUV、H264、常用软件介绍

2023-11-17

前言

相对而言,音视频开发算是有些门槛的。记得我第一次接触的时候,看别人的博客都看不懂。特别是写代码的时候,非常痛苦,只能抄别人的代码,却不知道为什么要这么写,也不知道应该怎么调整。后来总结了一下,痛苦的原因是在写代码之前没有掌握相关的基础知识,因此现在特地写了这样一篇博客,希望对大家有所帮助。

另,这篇博客主要是对自己做的笔记的一些总结,前前后后参考了许多文章和一些书籍,内容之间的连贯性或许不够好,也可能存在一些错误,如果发现了还望评论指正。

基本概念

声波

声波有三要素:

1) 频率,代表音调,即常说的高音、低音。频率越低,波形越长,穿越障碍物时能量衰减越小,可传播距离越远。

2) 振幅,代表响度,即音量大小。

3) 波形,代表音色,同样的音调和响度,钢琴和小提琴的声音听起来完全不同,这就是音色。波的形状决定了声音的音色,钢琴和小提琴的音色不同就是因为它们的介质所产生的波形不同。

人类耳朵的听力有一个频率范围,大约是 20Hz ~ 20kHz,而根据奈奎斯特定理(采样定理),按比声音最高频率高两倍以上的频率对声音进行采样,能够保证采样声音能够数字化,所以采样频率一般为 44.1kHz。

数字音频

数字音频有三个重要概念:

1) 采样,将信号从连续时间域上的模拟信号转换到离散时间域上的离散信号的过程。

2) 量化,指将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的)离散值的过程:

量化

一般用 8bit 或 16bit 来量化声音的一个采样。按 16bit 量化时有 65536 个可能取值的数字信号,比 8bit(256 个可能值) 更为精细。

3) 编码,即按照一定的格式压缩、存储采样和量化后的数据。裸数据格式通常为 PCM 格式。

PCM

通常音频的裸数据格式为脉冲编码调制(Pulse-code modulation,PCM)数据,描述一段 PCM 数据一般需要一下几个概念:

1) 量化格式(sampleFormat),也被称为位深度,比如 16bit 表示的数据格式,有 65536 个可能值,则位深度为 65536。

2) 采样率(sampleRate),也称为采样速度或者采样频率,定义了每秒从连续信号中提取并组成离散信号的采样个数,用赫兹(Hz)来表示。一般为 44.1kHz,指 1 个声道 1 秒钟有 44.1k 个数据,注意单位为“个”,每个数据的单位可以是 8bit、16bit 或其它,这是采样精度。采样频率的倒数叫作采样周期或采样时间,它是采样之间的时间间隔。

3) 声道数(channel)。分为单声道(mono)和立体声(stereo)两种,单声道只记录一种音源;立体声把现场各个方位的声音单独记录下来,并在播放时模拟当时的场景,可以营造出现场的逼真氛围。其中立体声有双声道、4.1 环绕立体声、5.1 环绕立体声几种。音视频开发中常用的只有单声道、双声道两种。

比特率(码率)

比特率指每秒传送的比特数,单位为 bps(Bit Per Second),比特率越高,传送数据速度越快。声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标。 多媒体行业在指音频或者视频在单位时间内的数据传输率时通常使用码流或码率,单位是 kbps(千位每秒)。视频中的码率的概念与声音中的相同,都是指由模拟信号转换为数字信号后,单位时间内的二进制数据量。比如 1.44Mbps,就是 1 秒内到达的数据量为 1.44Mb。(注意,是 bit,不是 byte)。

音频中比特率的计算公式如下:

比特率 = 采样率 * 采样精度 * 声道数目

视频中比特率的计算公式如下:

比特率 = 帧率 * 每帧数据大小

码率是音视频开发中非常重要的一个考虑因素,如果太大,则图像所占的内存也随之上升;太小,视频清晰度又会不足,因此码率的值需要根据实际情况权衡确定。

音频编码

压缩编码的原理实际上是压缩掉冗余信号,冗余信号指不能被人耳感知到的信号,包含人耳听觉范围之外的音频信号以及被掩盖掉的音频信号等。视频中的音频编码码率一般为 128kbit/s。

常见的压缩编码算法有:

1) WAV 编码

WAV 不会压缩音频,其中一种实现是在 PCM 数据前面加上 44 字节,分别描述 PCM 的采样率、声道数、数据格式等信息。

特点:音质非常好,大量软件都支持。
使用场合:多媒体开发的中间文件、保存音乐和音效素材。

PCM 转 WAV 的具体实现可以看我的另一篇博客:使用 AudioRecord 录制 PCM、

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

音视频开发基础概述 - PCM、YUV、H264、常用软件介绍 的相关文章

  • linux的mmc子系统与块设备关联

    1 前言 本文主要block组件的主要流程 在介绍的过程中 将详细说明和block相关的流程 涉及到其它组件的详细流程再在相关文章中说明 2 主要数据结构和API 2 1 struct mmc card Elemete Name struc

随机推荐

  • Python打包系统简单入门

    最近把pyenv pipenv这种都研究了一下 然后我发现一个严重的问题 就是我虽然看了半天这些工具 但是我对Python自己的打包系统却完全没有了解 所以这篇文章就来研究一下Python自带的打包系统 pip 先来详细介绍一下pip的用法
  • IOS_swift_函数用法

    1 多个返回值 func x x Int y Int gt Int Int let a x y let b x y return a b let a b x 10 y 3 print a a let val x 10 y 3 print v
  • 【STM32】STM32F103基于CubeIDE移植ThreadX

    前言 本来ThreadX全家桶是无缝接入STM32单片机的 但是今天突然发现ST官方没有X CUBE AZRTOS F1这个软件包 使用CubeMX添加工程组件的时候 也没有ThreadX可以选择 因此就有了此文 Keil环境下的移植可以参
  • ad pcb界面变成灰色无法编辑

    在pcb库中编译后有一个error 点之后就无法编辑pcb了 解决方法 右键 gt 过滤器 filter gt 清除过滤器 clear filter
  • 【CVPR2022论文精读DiffFace】DiffFace: Diffusion-based Face Swapping with Facial Guidance

    CVPR2022论文精读DiffFace DiffFace Diffusion based Face Swapping with Facial Guidance 0 前言 Abstract 1 Introduction 2 Related
  • Python数据分析--读取npz文件

    使用pycharm的朋友们 需要在解释器来安装相应库 有想练手的朋友 用百度网盘 链接 https pan baidu com s 1aOTPRsqkgX4isGDhMjLdlQ 提取码 1234 国民生产总值案例 读取npz文件 第一步
  • caffe SigmoidLayer 学习

    SimgoidLayer 的定义 neuron layer h template
  • 一文教你如何编写测试用例

    一 通用测试用例八要素 1 用例编号 2 测试项目 3 测试标题 4 重要级别 5 预置条件 6 测试输入 7 操作步骤 8 预期输出 二 具体分析通用测试用例八要素 1 用例编号 一般是数字和字符组合成的字符串 可以包括 下划线 单词缩写
  • 【学习笔记】 pytorch的使用语法和代码实例

    数据类型 1 torch FloatTensor 用于生成数据类型为浮点型的Tensor 传递给torch FloatTensor的参数可以是一个列表 也可以是一个维度值 torch randn 用于生成数据类型为浮点型且维度指定的随机Te
  • Java解析cron表达式实战

    目录 前言 实战 依赖 code 执行结果 前言 前面讲了CentOS中安装crontab以及cron表达式的规则说明 在实际开发中我们经常会用到 有时候我们懒得记规则的时候 我们就会用一些工具网站去解析 例如我常用的 https www
  • Vulhub靶场环境搭建

    在Ubantu系统上搭建靶场环境 一 ubantu系统准备 1 更新安装列表 sudo apt get update 2 安装docker io sudo apt install docker io 查看是否安装成功 docker v 3
  • Centos二进制安装Geth以太坊客户端

    环境准备 yum install git yum install golang 获取二进制包 网站 https geth ethereum org downloads wget https gethstore blob core windo
  • spring 5.x 系列第9篇 —— 整合mongodb (xml配置方式)

    一 项目说明 1 1 项目结构 配置文件位于 resources 下 项目以单元测试的方式进行测试 1 2 相关依赖 除了 Spring 的基本依赖外 需要导入 MongoDB 的整合依赖
  • JSON使用示例

    1 什么是json JSON 说白了就是JavaScript用来处理数据的一种格式 这种格式非常简单易用 JSON支持的语言非常多 包括JavaScript C PHP Java等等 这是由于JSON是独立于语言的轻量级的数据交换格式 2
  • webpack性能优化,CDN内容分发分发网络

    CDN英文全称Content Delivery Network 中文翻译即为内容分发网络 当用户输入url后 首先向LDNS 本地DNS 发起域名解析请求 LDNS检查缓存中是否有该url的IP地址记录 如果有 则直接返回给用户 如果没有
  • MongoDB入门

    MongoDB MongoDB相关概念 业务应用场景 传统的关系型数据库 如MySQL 在数据操作的 三高 需求以及应对Web2 0的网站需求面前 显得力不从心 解释 三高 需求 High performance 对数据库高并发读写的需求
  • (十六)ADC转换实验

    本节主要是回顾有关于ADC的对应内容 我们这章通过一个AD芯片xpt2046来读取外部电压的变化 将电压的数字量显示在数码管上 关于ADC 我们都知道单片机内部都是数字量 就是1或者0 而我们的电流电压在传递的时候是模拟量 也就是模拟量很可
  • 由于找不到 libmmd.dll,无法继续执行代码。试试替换libmmd.dll文件可能会解决此问题

    由于找不到 libmmd dll 无法继续执行代码 重新安装程序可能会解决此问题 解决方法 1 右键桌面快捷图标 打开文件所在的位置 在这个文件夹下搜索libmmd dll 2 将搜索出来的libmmd dll复制到MAXSON下的CINE
  • NLTK Downloader出现 [Error 11004]getaddrinfo failed的错误时怎么解决

    当打开NLTK下载器时 弹出 Error 11004 getaddrinfo failed的提示窗口 打开NLTK下载器 import nltk nltk download 出现这样的问题时要怎么解决 很多人都走错了思路导致浪费了不少时间在
  • 音视频开发基础概述 - PCM、YUV、H264、常用软件介绍

    前言 相对而言 音视频开发算是有些门槛的 记得我第一次接触的时候 看别人的博客都看不懂 特别是写代码的时候 非常痛苦 只能抄别人的代码 却不知道为什么要这么写 也不知道应该怎么调整 后来总结了一下 痛苦的原因是在写代码之前没有掌握相关的基础