Android音视频的基础

news2024/12/23 5:16:59

视频是什么?

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

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

帧率
帧率,即单位时间内帧的数量,单位为:帧/秒 或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帧。通过下面的表可以查询到具体的类型。
在这里插入图片描述

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

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

相关文章

VS Code开发插件使用 pnpm 打包异常的解决姿势

前言 刚刚准备发一个插件,发现用 pnpm 打出一个本地插件包直接扑街了。 这里只聚焦错误问题的解决,不是发插件的教程。。 聊点背景信息,vscode 的插件命令行的是 vsce 这个模块提供的 cli 能力去做的 环境 pnpm : 8.x 错误截图 本地打…

image with CV

""" 视觉:基本API应用(OPENCV) """ import cv2 import numpy as np"""图像读取方式3. 1.cv2.imread(filename or path, flags)flags0:灰度图像;flags1表示RGB图像;fl…

Apache Incubator Answer 本地开发部署

文章目录 简介Github文档插件部署 Answer开发环境编译项目初始化项目运行项目 简介 一款适合任何团队的问答平台软件。 Apache Incubator Answer是一个开源项目,它是一个用于构建和部署问答系统的框架。该项目是Apache软件基金会的孵化器项目,提供一个…

iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑)

引言 在 iOS 开发中,将 IPA 文件上传到苹果开发者中心是一个重要的步骤。通常情况下,我们需要使用 Mac 电脑上的 Xcode 或 Application Loader 工具来完成这个任务。然而,如果你没有 Mac 电脑,也没有关系,本文将介绍一…

【图论】Leetcode 994. 腐烂的橘子【中等】

腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单…

运营商名称 是如何显示到 手机通知栏上的?

在我们日常使用手机的过程中,经常会在通知栏或设置菜单中看到特定的运营商名称,例如"中国移动"、"中国联通"或"中国电信"等。 那么,这些运营商的名称是如何出现在我们手机上的呢?手机又是如何区分不…

15. 【Android教程】按钮 Button/ImageButton

在前面两章我们讲了 TextView,它是一个纯输出的控件;而 EditText 在 TextView 基础之上加入了简单的输入功能;今天要讲的 Button 是一个和用户互动感很强的控件,从今往后不再是单纯的文本展示,我们可以通过 TextView、…

汽车4S行业的信息化特点与BI建设挑战

汽车行业也是一个非常大的行业,上下游非常广,像主机厂,上游的零配件,下游的汽车流通,汽车流通之后的汽车后市场,整个链条比较长。今天主要讲的是汽车流通,汽车4S集团。一个汽车4S集团下面授权代…

微信小程序使用iconfont

进入iconfont,添加至项目 进入项目,点击生成代码,或更新代码 点击打开样式 复制内容到小程序的style文件夹下 最后引入到app.wxss

C++中的string设计成模板的原因

查看string的文档可以发现&#xff0c;string被设计成模板&#xff0c;为什么这样设计呢&#xff1f; string文档链接&#xff1a;<string> - C Reference (cplusplus.com) 随着计算机的发展&#xff0c;出现了很多编码&#xff08;用于管理字符&#xff09;&#xff0c…

https的配置和使用(以腾讯云为例)

1、注册域名 2、获取证书 3、下载证书 下载下来的证书所有格式 4、在服务器上下载nginx并配置 nginx的配置文件 如下 server {listen 80;listen 443 ssl;server_name delegate.letspiu.net.cn;ssl on; #开启ssl#指定证书位置ssl_certificate /etc/ss…

集成 LlamaIndex 和 Qdrant 相似性搜索以进行患者记录检索

介绍 由于医疗技术、数字健康记录(EHR)和可穿戴健康设备的进步,医疗领域目前正在经历数据的显着激增。有效管理和分析这些复杂多样的数据的能力对于提供定制医疗保健、推进医学研究和改善患者健康结果至关重要。矢量数据库是专门为高效处理和存储多维数据而定制的,作为一系…

Golang | Leetcode Golang题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; var phoneMap map[string]string map[string]string{"2": "abc","3": "def","4": "ghi","5": "jkl","6": "mno","7": &…

爬虫 BeautifulSoup模块

爬虫 BeautifulSoup模块 【一】介绍 【1】说明 BeautifulSoup库是python的一个第三方库&#xff0c;主要用于处理HTML和XML文档他提供了一些简单的、python式的函数来解析、导航、搜索以及修改分析树&#xff0c;使得从网页抓取的数据变得简单高效BeautifulSoup自动将输入文…

Debian安装1panel管理面板教程-最新

1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 1Panel面板是一个强大的服务器管理工具&#xff0c;它通过提供一站式管理、易于使用的界面、高度的可定制性、安全可靠的性能、强大的扩展性以及活跃的社区支持&#xff0c;为用户提供了一个高效、便捷的管理解决方案…

「2024」React 状态管理入门

概念 简单来说&#xff0c;状态指的是某一时刻应用中的数据或界面的呈现。这些数据可能包括用户填写表单的信息、应用内的用户偏好设置、应用的页面/路由状态、或者任何其他可能改变UI的信息。 状态管理是前端开发中处理用户界面(UI)状态的过程&#xff0c;在复杂应用中尤其重…

如何让MacOS「终端」走代理

在 MacOS 操作系统中&#xff0c;默认情况下&#xff0c;终端命令行不会通过代理进行网络连接。这导致在应用软件研发过程中&#xff0c;许多需要通过命令行下载安装的软件或依赖包无法成功安装。经常出现Failed to connect to xxx port 443 after 75329 ms: Couldnt connect t…

Window安装PostgresSQL

PostgreSQL 安装参考&#xff1a;Windows下安装PostgreSQL_window 安装postgresql-CSDN博客 安装好后打开pgAdmin4 配置Navicat连接PostgresSQL 找到安装目录文件 pg_hba.conf 修改配置增加&#xff1a; 修改前&#xff1a; # TYPE DATABASE USER ADDRES…

联想电脑开启虚拟化失败,开启虚拟化却提示还没有开启虚拟化

安装虚拟机的时候&#xff0c; 电脑要开启虚拟化&#xff0c; Intel VT&#xff0c; 去BIOS开启了&#xff0c; 但是依然报错&#xff0c;说虚拟化处于禁用状态。 解决方案&#xff1a; 去联想官方&#xff0c;下载BIOS更新包&#xff0c;更新BIOS。 更新文档&#xff1a; 联…

网络安全---Packet Tracer - 配置扩展 ACL

一、实验目的 在Windows环境下利用Cisco Packet Tracer进行 配置防火墙操作。 二、实验环境 1.Windows10、Cisco Packet Tracer 8.2 2.相关的环境设置 在最初的时候&#xff0c;我们已经得到了搭建好的拓扑模型&#xff0c;利用已经搭建好的拓扑模型&#xff0c;进行后续的…