Android音视频的基础

视频是什么?

视频就是由一系列图片构成的。

视频帧
帧,是视频的一个基本概念,表示一张画面,如上面的翻页动画书中的一页,就是一帧。一个视频就是由许许多多帧组成的。

帧率
帧率,即单位时间内帧的数量,单位为:帧/秒 或fps(frames per second)。

帧率的一般以下几个典型值:
24/25 fps:1秒 24/25 帧,一般的电影帧率。
30/60 fps:1秒 30/60 帧,游戏的帧率,30帧可以接受,60帧会感觉更加流畅逼真。
85 fps以上人眼基本无法察觉出来了,所以更高的帧率在视频里没有太大意义。

色彩空间
这里我们只讲常用到的两种色彩空间。

RGB
RGB的颜色模式应该是我们最熟悉的一种,在现在的电子设备中应用广泛。通过R G B三种基础色,可以混合出所有的颜色。

YUV
这里着重讲一下YUV,这种色彩空间并不是我们熟悉的。这是一种亮度与色度分离的色彩格式。

早期的电视都是黑白的,即只有亮度值,即Y。有了彩色电视以后,加入了UV两种色度,形成现在的YUV,也叫YCbCr。

Y:亮度,就是灰度值。除了表示亮度信号外,还含有较多的绿色通道量。
U:蓝色通道与亮度的差值。
V:红色通道与亮度的差值。

YUV和RGB的换算

Y = 0.299R + 0.587G + 0.114B 
U =0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
——————————————————
R = Y + 1.14V
G = Y - 0.39U0.58V
B = Y + 2.03U

音频是什么?

音频数据的承载方式最常用的是脉冲编码调制,即PCM

PCM采集
在自然界中,声音是连续不断的,是一种模拟信号,那怎样才能把声音保存下来呢?那就是把声音数字化,即转换为数字信号。
采集步骤:模拟信号->采样->量化->编码->数字信号

采样频率
采样频率:⼀秒钟内采样的次数。采样频率越⾼,越接近原始信号。
根据Nyquist采样定理,要想重建原始信号,采样频率必须⼤于信号中最⾼频率的两倍。⼈能感受到的频率范围为20HZ–20kHZ, ⼀般⾳乐的采样频率为44.1kHZ, 更⾼的可以是48kHZ和96kHZ。

采样位数
数字信号是⽤0和1来表示的。采样位数就是采样值⽤多少位0和1来表示,也叫采样精度
位数越多,记录的值越准确,还原度越高。

声道
声道:处理的声⾳是单声道还是⽴体声。Android⽀持双声道⽴体声和单声道。
CHANNEL_IN_MONO单声道,CHANNEL_IN_STEREO⽴体声。

码率(比特率)
⽐特率:每秒传送的⽐特(bit)数。(单位时间播放连续的媒体(如压缩后的音频或视频)的比特数量。)比特率越高,带宽消耗得越多。
码率 = 采样率 * 采样位数 * 声道数 (单位:bps)

音频采集和播放:

⼀般⽤专⻔的芯⽚(通常叫codec芯⽚)采集⾳频,做AD转换,然后把数字信号通过I2S总线(主流⽤I2S总线,也可以⽤其他总线,⽐如PCM总线)送给CPU处理(也有的会把codec芯⽚与CPU芯⽚集成在⼀块芯⽚中)。当要播放时CPU会把⾳频数字信号通过I2S总线送给codec芯⽚,然后做DA转换得到模拟信号再播放出来。
在这里插入图片描述

为什么要编码,如何编码(编码原理) ?

编码的目的
为了压缩。各种视频编码方式,都是为了让视频变得体积更小,有利于存储和传输。

1、视频编码

视频编码格式

名称推出机构推出机构目前使用领域
HEVC(H.265)MPEG/ITU-T2013研发中
H.264MPEG/ITU-T2003各个领域
MPEG4MPEG2001不温不火
MPEG2MPEG1994数字电视
VP9Google2013研发中
VP8Google2008不普及
VC-1Microsoft Inc.2006微软
……………………

2、音频编码

音频编码格式

名称推出机构推出机构目前使用领域
AACMPEG1997各个领域(新)
AC-3Dolby Inc.1992电影
MP3MPEG1993各个领域(旧)
WMAMicrosoft Inc.1999微软平台
……………………

H264介绍

一、H264简介

H.264,通常也被称之为H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)

H264是目前最主流的视频编码标准,所以接下来我们主要介绍一下H264

二、H264相关概念

1、H.264 的基本单位
H.264定义的结构中,一个视频图像编码后的数据叫做一帧。 一帧是由一个或多个片(slice)组成的,一个片是由一个或多个宏块(MB)组成的(宏块是H264编码的基本单位),一个宏块是由16x16的yuv数据组成的。

2、帧类型
H.264的协议中,定义了三类帧,分别是:I帧、B帧和P帧。

  • I帧:帧内编码帧。就是一个完整帧(key frame)
    - I帧可以看作一个图像经过压缩之后的产物,是一种自带全部信息的独立帧,无需参考其他图像便可独立进行解码,可以简单理解为一张静态图像; (压缩率最低

  • P帧:前向预测编码帧。是一个非完整帧,通过参考前面的I帧或P帧生成。
    - 记录了本帧跟之前的一个关键帧(或P帧)的差别。编码时编码当前P帧与参考帧的差异数据,解码时需要用之前缓存的画 面叠加上本帧定义的差别,生成最终画面。 (压缩率比I帧高,比B帧低

  • B帧:双向预测内插编码帧。参考前后图像帧编码生成。B帧依赖其前最近的一个I帧或P帧及其后最近的一个P帧。(双向预测 / 参考)
    - 编码时,只编码当前B帧与前后参考帧的差异数据。解码时,需要先解码出前后的参考帧,再结合差异数据解码出当前B帧完整的图像。(压缩率是最高,但是耗时

  • DTS:Decode Time Stamp(解码时间戳)。DTS主要是标识读入内存中的帧数据在什么时候开始送入解码器中进行解码。

  • PTS:Presentation Time Stamp(显示时间戳)。PTS主要用于度量解码后的视频帧什么时候被显示出来

在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。
因为B帧打乱了解码和显示的顺序(要解码B帧需要先解码后面的P帧),所以一旦存在B帧,PTS和DTS就会不同。
DTS主要用于视频的解码,在解码阶段使用。PTS主要用于视频的同步和输出.在显示的时候使用。

在这里插入图片描述

3、GOP画面组
一组变化不大的视频帧。
GOP结构一般有两个数字,其中一个是GOP的长度(即两个I帧之间的B帧和P帧数),另一个数字为I帧和P帧之间的间隔距离(即B帧数)。
M=3,N=12,M指两个I帧和P帧之间的距离,N指定两个I帧之间的距离。
例如M=3,N=12的GOP结构为:IBBPBBPBBPBBI

GOP的第一帧成为关键帧:IDR
IDR帧一定是I帧,但是I帧不一定是IDR帧。

4、色彩空间
H264采用的是YUV。
YUV存储方式分为两大类:planar 和 packed。

planar:先存储所有Y,紧接着存储所有U,最后是V。
packed:每个像素点的 Y、U、V 连续交叉存储。

由于人眼对色度敏感度低,所以可以通过省略一些色度信息,即亮度共用一些色度信息,进而节省存储空间。
因此,planar又区分了以下几种格式: YUV444、 YUV422、YUV420

三、H264压缩方式

1、H264压缩算法
H264采用的核心算法是帧内压缩帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
帧内(Intraframe)压缩的原理是:当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩率一般不高。
帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。

2、H264压缩方式
H.264压缩视频数据时的具体方式步骤如下:

  1. 分组,也就是将一系列变换不大的图像归为一个组,即一个GOP
  2. 定义帧,将每组的图像帧归分为I帧、P帧和B帧三种类型
  3. 预测帧, 以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧
  4. 数据传输, 最后将I帧数据与预测的差值信息进行存储和传输

四、H264分层结构

H264的主要目标是为了有高的视频压缩比和良好的网络亲和性,为了达成这两个目标,H264的解决方案是将系统框架分为两个层面,分别是视频编码层面(VCL)和网络抽象层面(NAL)
在这里插入图片描述

  1. VLC层(Video Coding Layer)

VLC层是对核心算法引擎、块、宏块及片的语法级别的定义,负责有效表示视频数据的内容,最终输出编码完的数据SODB
通俗的讲:负责高效的视频内容表示, VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。

  1. NAL层(Network Abstraction Layer)

NAL层:负责将VCL产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。
通俗的讲:负责以网络所要求的恰当的方式对数据进行打包和传送,是传输层。不管在本地播放还是网络播放,都要通过这一层来传输。
NAL层将SODB打包成RBSP然后加上NAL头组成一个NALU单元
在这里插入图片描述

  1. NALU (NAL Unit)

H.264原始码流(裸流)是由一个接一个NALU组成,结构如下图:
在这里插入图片描述
NALU = 一组对应于视频编码的
NALU头部信息
+ 一个原始字节序列负荷RBSP(Raw Byte Sequence Payload)
然后一个NALU又被分为: [StartCode] [NALU Header] [NALU Payload] 三部分

  1. StartCode
    Start Code 用于标示这是一个NALU 单元的开始,必须是”00 00 00 01” 或”00 00 01”
  2. NALU Header
    NAL Header由三部分组成,forbidden_bit(1bit),nal_reference_bit(2bits)(优先级),nal_unit_type(5bits)(类型)。
    在这里插入图片描述
  3. SODB、 RBSP

SODB(String Of Data Bit): 数据比特串,是编码后的原始数据;
RBSP(Raw Byte Sequence Payload): 原始字节序列载荷,是在原始编码数据后面添加了结尾比特,一个bit 1和若干个bit 0,用于字节对齐。
在这里插入图片描述

五、H264码流结构

H264码流是由一个个的NAL单元组成,其中SPS、PPS、IDR和SLICE是NAL单元某一类型的数据。
SPS是序列参数集、PPS是图像参数集
在这里插入图片描述
一帧图片经过 H.264 编码器之后,NAL单元就是装载着这些片(被编码为一个或多个片 slice), 每片包含整数个宏块(至少一个宏块,最多包含整个图像宏块)
在这里插入图片描述

六、H264封装格式

H264码流分两种组织⽅式,⼀种是AnnexB格式,⼀种是AVCC格式。

  1. AnnexB格式
    [start code]NALU | [start code] NALU |...这种格式比较常见,也就是我们熟悉的每个帧前⾯都有0x00 00 00 01或者0x00 00 01作为起始码。
    H264文件就是采⽤的这种格式,每个帧前⾯都要有个起始码。SPS PPS等也作为⼀类NALU存储在这个码流中,⼀般在码流最前面。也就是说这种格式包含VCL 和非VCL 类型的NALU。
    一般H.264编码器的默认输出为:起始码+NALU(Nal单元)

为什么需要起始码:0x00000001或者0x000001?
答:因为每一个NALU都需要分隔,要分隔帧操作,就相对于写文章断句一样

从上面我们指定每个NAL header = forbidden_bit(1bit) + nal_reference_bit(2bits) + nal_unit_type(5bits)
这个头部信息是可以区分类型的,例如:I帧、P帧、B帧。通过下面的表可以查询到具体的类型。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

39-性能分析(下):APIServer性能测试和调优实战

在API上线之前,我们需要知道API的性能,以便知道API服务器所能承载的最大请求量、性能瓶颈,再根据业务对性能的要求,来对API进行性能调优或者扩缩容。通过这些,可以使API稳定地对外提供服务,并且让请求在合理…

网络网络层之(7)PPPOE协议

网络网络层之(7)PPPOE协议 Author: Once Day Date: 2024年4月7日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文档可参考专栏:通信网络技术_Once-Day…

紫叶写作靠谱不 #笔记#学习方法#媒体

紫叶写作是一款非常好用的论文写作工具,它不仅提供了查重降重的功能,还能帮助用户快速完成论文的撰写和格式编辑。通过紫叶写作,用户可以轻松地查重降重,避免论文中出现抄袭和重复的现象,保证论文的原创性和质量。 紫叶…

【网络】P2P打洞原理(简单描述)

本文首发于 ❄️慕雪的寒舍 引入 如果你折腾过NAS或者BT下载等等玩意,可能听说过“P2P打洞”这一技术名词。简单来说,P2P打洞可以让我们直接在外网访问内网的设备,从而让没有公网IP的家庭设备也能获得“公网直连”的速度。 比如绿联、极空间…

创建个人百度百科需要什么条件?

互联网时代,创建百度百科词条可以给个人带来更多的曝光和展现,相当于一个镀金的网络名片,人人都想上百度百科,但并不是人人都能创建上去的。 个人百度百科词条的创建需要满足一定的条件,今天伯乐网络传媒就来给大家聊聊…

神经网络解决回归问题(更新ing)

神经网络应用于回归问题 神经网络是处理回归问题的强大工具,它们能够学习输入数据和输出之间的复杂关系。 神经网络提供了一种灵活且强大的框架,用于建模和预测回归问题。通过 适当的 网络结构、训练策略和正则化技术,可以有效地从数据中学…

在Linux系统上实现TCP(socket)通信

一.什么TCP TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 二.TCP通信流程 三. TCP 服务器端 1 创建socket int sockfd socket(AF_INET, SOCK_STREAM, 0); //SOCK_STREAM tcp通信2 绑定(bind) struct sockaddr_in myad…

系统架构最佳实践 -- 智慧图书管理系统架构设计

随着数字化时代的到来,智慧图书管理系统在图书馆和机构中扮演着重要的角色。一个优秀的图书管理系统不仅需要满足基本的借阅管理需求,还需要具备高效的性能、良好的扩展性和稳定的安全性。本文将讨论智慧图书管理系统的架构设计与实现,以满足…

计算机视觉异常检测——PatchCore面向全召回率的工业异常检测

1. 概述 异常检测问题在工业图像数据分析中扮演着至关重要的角色,其目的是从大量正常数据中识别出异常行为或模式。这一任务的挑战在于,正常数据的样本相对容易获取,而异常情况却因其稀有性和多样性而难以收集。为了解决这一问题&#xff0c…

裸机开发之汇编、寄存器

一、什么是汇编?为什么学汇编? 在之前写控制代码的时候就在想:底层是怎么控制的?后来经过学习知道之前所编写的代码都是应用层代码,顾名思义就是在系统写好的底层之上调用系统函数。原以为底层是指写系统写好的底层函数…

苹果电脑(Mac)怎么清理 itunes 备份?

苹果电脑用户广泛利用 iTunes 应用程序对 iPhone 或 iPad进行定期备份,以确保珍贵的数据安全无虞。然而,随着备份历史的增长,它们会在磁盘上积累大量空间,尤其当您频繁为多台设备备份时,存储资源可能会迅速消耗殆尽。为…

3D Web轻量化引擎HOOPS Commuicator如何从整体装配中创建破碎的装配零件和XML?

前言 虽然可以从某些本机CAD格式(其子组件驻留在单独的文件中,例如CATIA V5、Creo - Pro/E、NX或SolidWorks)创建破碎装配,但无法从整体装配文件(例如IFC、Revit)创建或3DXML。 本文介绍了一个示例&#…

学习Rust的第一天:基础知识

Introduction 介绍 I am Shafin Murani is a software development student and I am documenting every single day of my progress in learning rust. This is the first article of the series. Shafin Muranishi 是一名软件开发专业的学生,这是他在30天内记录学…

无影云电脑不能连接到本机的调试串口的解决方案

目录 概述 解决方案 云端电脑中的操作 本地USBDK驱动程序的更新 概述 我从1月份开始使用阿里的无影云电脑进行嵌入式开发板的测试,主要的原因有两个:一是平时使用的笔记本资源过于紧张,二是方便移动办公,这样我只要平时拿着开…

UDP简单总结

UDP:用户数据报协议 特点: 无连接、不可靠通信 不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口、目的地IP、程序端口和数据(限制在64KB内) 发送方不管对方是否在线,数据在中间丢失也不管,…

备考分享丨云计算HCIE实验考试需要注意什么

去年九月底我在朋友的推荐下报考了誉天的云计算方向,在此期间我非常感谢田sir、苗苗老师和凡凡老师,每次我遇见问题找他们都能给我完完全全的解决,给我这个非科班出身的学员很大的鼓励与帮助。 我是经济学专业,毕业之后没有考研&…

java数据结构与算法刷题-----LeetCode785. 判断二分图

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 深度优先广度优先 二分图:将所有结点分成两个集合&am…

​如何使用 ArcGIS Pro 制作带贴图建筑

对于用GIS软件制作三维建筑,很多时候都是制作的建筑体块,这里为大家介绍一下怎么使用 ArcGIS Pro 制作带贴图的建筑,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的建筑数据,除了建筑数据,常见…

Simple_SSTI_2

Simple_SSTI_2 破解思路 1、启动场景2、用kali的tplmap扫一下 1、启动场景 http://114.67.175.224:18040/ 然后机会发现 页面啥也不是,查看源码后,看了好像又没看 2、用kali的tplmap扫一下 安装tplmap【已安装,可略过】:在kali终端安装git…

GitHub 仓库 (repository) Branch - SSH clone URL - Clone in Desktop - Download ZIP

GitHub 仓库 [repository] Branch - SSH clone URL - Clone in Desktop - Download ZIP 1. Branch2. SSH clone URL3. Clone in Desktop4. Download ZIPReferences 1. Branch 显示当前分支的名称。从这里可以切换仓库内分支,查看其他分支的文件。 2. SSH clo…