Skip to content

Commit be31dee

Browse files
committed
update
1 parent a6cb70a commit be31dee

4 files changed

Lines changed: 104 additions & 8 deletions

File tree

VideoDevelopment/Android音视频开发/1.音视频基础知识.md

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@
55
基本概念
66
---
77

8+
- 图像
9+
图像是人类视觉的基础,是自然景物的客观反映,是人类认识世界和人类本身发展的重要源泉。“图”是物体反射或透射光的分布,“像”是人的视觉系统所接收的图在人脑中所形成的印象或认识。图像是客观对象的一种相似性的、生动性的描述或写真,是人类社会活动中最常用的信息载体,或者说图像是客观对象的一种表示,它包含了被描述对象的有关信息。广义上,图像就是所有具有视觉效果的画面,包括纸介质的、底片或照片上的、电视上的、投影仪或计算机屏幕上的画面。在计算机领域,与图像相关的概念非常多,包括像素、PPI、图像位深度等。
10+
11+
图像本质上是由很多“带有颜色的点”组成的,而这些点,就是“像素”。像素的英文叫Pixel,缩写为PX。这个单词是由图像(Picture)和元素(Element)这两个单词所组成的。
12+
13+
像素是图像显示的基本单位,分辨率是指一张图片的宽度和高度的乘积,单位是像素。通常说一张图片的大小,例如1920×1080像素,是指宽度为1920像素,高度为1080像素。它们的乘积是1920×1080=2 073 600,也就是说这张图片是两百万像素的。1920×1080,也被称为这幅图片的分辨率
14+
815
- 媒体
916

1017
是表示,传输,存储信息的载体,常人们见到的文字、声音、图像、图形等都是表示信息的媒体。
@@ -88,10 +95,15 @@
8895
LCD液晶显示器和传统的CRT显示器,分辨率都是重要的参数之一。传统CRT显示器所支持的分辨率较有弹性,而LCD的像素间距已经固定,所以支持的显示模式不像CRT那么多。LCD的最佳分辨率,也叫最大分辨率,在该分辨率下,液晶显示器才能显现最佳影像。
8996

9097
每个像素有RGB三种颜色组成,每色有8bit,取值范围为(0 ~ 255)也就是2的8次方。这种方式表达出来的颜色,也被称为24位色(占用24bit)。
91-
9298
1080P的P是指Progressive scan(逐行扫描),即垂直方向像素点,也就是高。所以1920*1080叫1080P,不叫1920P。
9399

94100

101+
RGB为3个分量,假如每个分量占8b,取值分别为0~255。那么这3个分量的组合取值为256×256×256=16 777 216种,因此也简称为1600万色。这种颜色范围已经超过了人眼可见的全部色彩,所以又叫真彩色。更高的精度,对于人眼来讲,已经没有意义了,完全识别不出来。RGB这3色,每色有8b,这种方式表达出来的颜色,也被称为24位真彩色。
102+
103+
- PPI
104+
每英寸的像素数(Pixels Per Inch,PPI)是手机屏幕(或计算机显示器)上每英寸面积到底能放下多少“像素”。这个值越高,图像就越清晰细腻。
105+
PPI是像素的密度单位,PPI值越高,画面的细节就越丰富,所以数码相机拍出来的图片因品牌或生产时间不同可能有所不同,常见的有72PPI、180PPI和300PPI。DPI(Dots Per Inch)是指输出分辨率,是针对输出设备而言的,一般的激光打印机的输出分辨率为[300DPI,600DPI],印刷的照排机可达到[1200DPI,2400DPI],常见的冲印一般为[150DPI,300DPI]
106+
95107
- DTS
96108

97109
Decode Time Stamp,主要用于标识读入内存中的比特流在什么时候开始送入解码器中进行解码。
@@ -279,18 +291,13 @@ U和V不是基础信号,他俩都是被正交调制的。早期的电视都是
279291

280292
YUV和RGB视频信号相比,最大的优点在于只需要占用极少的带宽,YUV只需要占用RGB一般的带宽。
281293

282-
283294
YUV 色彩编码模型,其设计初衷为了解决彩色电视机与黑白电视的兼容问题,利用了人类眼睛的生理特性(对亮度敏感,对色度不敏感),允许降低色度的带宽,降低了传输带宽。
284295

285296
在计算机系统中应用尤为广泛,利用 YUV 色彩编码模型可以降低图片数据的内存占用,YUV只需要占用RGB一般的带宽,从而提高数据处理效率。
286297

287298
另外,YUV 编码模型的图像数据一般不能直接用于显示,还需要将其转换为 RGB(RGBA) 编码模型,才能够正常显示图像。
288299

289300

290-
————————————————
291-
版权声明:本文为CSDN博主「字节流动」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
292-
原文链接:https://blog.csdn.net/Kennethdroid/article/details/94031821
293-
294301

295302
YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有四种,
296303
- YUV 4:4:4
@@ -372,8 +379,9 @@ PAR DAR SAR
372379

373380
##### 硬件加速
374381

375-
硬件加速(Hardware acceleration)就是利用硬件模块来替代软件算法以充分利用硬件固有的快速特性。硬件加速通常比软件算法的效率要高。
376-
将2D、3D图形计算相关工作交给GPU处理,从而释放CPU的压力,也是属于硬件加速的一种。
382+
383+
中央处理器(Central Processing Unit,CPU),包括算术逻辑部件(Arithmetic Logic Unit,ALU)和高速缓冲存储器(Cache)及实现它们之间联系的数据(Data)、控制及状态的总线(Bus)。GPU即图形处理器(Graphics Processing Unit),专为执行复杂的数学和几何计算而设计的,拥有二维或三维图形加速功能。GPU相比于CPU具有更强大的二维、三维图形计算能力,可以让CPU从图形处理的任务中解放出来,执行其他更多的系统任务,这样可以大大提高计算机的整体性能。硬件加速(Hardware Acceleration)就是利用硬件模块来替代软件算法以充分利用硬件所固有的快速特性,硬件加速通常比软件算法的效率要高。例如将与二维、三维图形计算相关的工作交给GPU处理,从而释放CPU的压力,是属于硬件加速的一种。
384+
377385

378386

379387

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
## 视频播放简介
2+
3+
4+
解封装是指将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类有很多,例如MP4、MKV、RMVB、TS、FLV、AVI等,其作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
5+
<img src="https://github.com/CharonChui/Pictures/blob/master/video_play_list_1.png" />
6+
7+
8+
### 1.解协议
9+
解协议是指将流媒体协议的数据,解析为标准的封装格式数据。音视频在网络上传播的时候,常采用各种流媒体协议,例如HTTP、RTMP、RTMP、MMS等。这些协议在传输音视频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放、暂停、停止),或者对网络状态的描述等。在解协议的过程中会去除信令数据而只保留音视频数据。例如采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
10+
注意:“文件”本身也是一种“协议”,常见的流媒体协议有HTTP、RTSP、RTMP等。
11+
12+
### 2.解封装
13+
14+
解封装是指将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类有很多,例如MP4、MKV、RMVB、TS、FLV、AVI等,其作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
15+
16+
### 3.解码
17+
18+
解码是指将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC、MP3、AC-3等,视频的压缩编码标准则包含H.264、MPEG-2、VC-1等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P、RGB等。压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
19+
20+
### 4.音视频同步
21+
根据解封装模块在处理过程中获取的参数信息,同步解码出来的视频和音频数据,被送至系统的显卡和声卡播放出来。为什么需要音视频同步呢?媒体数据经过解复用流程后,音频/视频解码便是独立的,也是独立播放的,而在音频流和视频流中,其播放速度是由相关信息指定的,例如视频是根据帧率,音频是根据采样率。从帧率及采样率即可知道视频/音频播放速度。声卡和显卡均是以一帧数据来作为播放单位,如果单纯依赖帧率及采样率进行播放,在理想条件下,应该是同步的,不会出现偏差。
22+
23+
下面以一个44.1kHz的AAC音频流和24f/s的视频流为例来说明。如果一个AAC音频frame每个声道包含1024个采样点,则一个frame的播放时长为(1024/44 100)×1000ms≈23.27ms,而一个视频frame播放时长为1000ms/24≈41.67ms。理想情况下,音视频完全同步,但实际情况下,如果用上面那种简单的方式,慢慢地就会出现音视频不同步的情况,要么是视频播放快了,要么是音频播放快了。可能的原因包括:一帧的播放时间难以精准控制;音视频解码及渲染的耗时不同,可能造成每一帧输出有一点细微差距,长久累计,不同步便越来越明显;音频输出是线性的,而视频输出可能是非线性的,从而导致有偏差;媒体流本身音视频有差距(特别是TS实时流,音视频能播放的第1个帧起点不同),所以解决音视频同步问题引入了时间戳,它包括几个特点:首先选择一个参考时钟(要求参考时钟上的时间是线性递增的),编码时依据参考时钟给每个音视频数据块都打上时间戳。播放时,根据音视频时间戳及参考时钟来调整播放,所以视频和音频的同步实际上是一个动态的过程,同步是暂时的,不同步则是常态。
24+
25+
ffplay是使用FFmpeg API开发的功能完善的开源播放器。在ffplay中各个线程如图5-45所示,扮演角色如下:read_thread线程扮演着图中Demuxer的角色;video_thread线程扮演着图中VideoDecoder的角色;audio_thread线程扮演着图中Audio Decoder的角色。主线程中的event_loop函数循环调用refresh_loop_wait_event则扮演着视频渲染的角色。回调函数sdl_audio_callback扮演着图中音频播放的角色。VideoState结构体变量则扮演着各个线程之间的信使。
26+
27+
- (1)read_thread线程负责读取文件内容,将video和audio内容分离出来后生成packet,将packet输出到packet队列中,包括Video Packet Queue和Audio Packet Queue,不考虑subtitle。
28+
- (2)video_thread线程负责读取Video PacketsQueue队列,将video packet解码得到VideoFrame,将Video Frame输出到Video FrameQueue队列中。
29+
- (3)audio_thread线程负责读取Audio PacketsQueue队列,将audio packet解码得到AudioFrame,将Audio Frame输出到Audio FrameQueue队列中。
30+
- (4)主线程→event_loop→refresh_loop_wait_event负责读取Video Frame Queue中的video frame,调用SDL进行显示,其中包括了音视频同步控制的相关操作。
31+
- (5)SDL的回调函数sdl_audio_callback负责读取Audio Frame Queue中的audio frame,对其进行处理后,将数据返回给SDL,然后SDL进行音频播放。
32+
33+
FFmpeg解码流程图:
34+
<img src="https://github.com/CharonChui/Pictures/blob/master/ffmpg_decod_list_1.jpg" />
35+
36+
- (1)注册所有容器格式和CODEC,使用av_register_all,最新版本中无须调用该函数。
37+
- (2)打开文件av_open_input_file,最新版本为avformat_open_input。
38+
- (3)从文件中提取流信息av_find_stream_info。
39+
- (4)枚举所有流,查找的种类为CODEC_TYPE_VIDEO。
40+
- (5)查找对应的解码器avcodec_find_decoder。
41+
- (6)打开编解码器avcodec_open。
42+
- (7)为解码帧分配内存avcodec_alloc_frame。
43+
- (8)不停地从码流中提取帧数据av_read_frame。
44+
- (9)判断帧的类型,对于视频帧则调用avcodec_decode_video。
45+
- (10)解码完后,释放解码器avcodec_close。
46+
- (11)关闭输入文件av_close_input_file。
47+
48+
注意:该流程图为FFmpeg 2.x的版本,最新的FFmpeg 4.x系列的流程图略有改动。
49+
50+

VideoDevelopment/关键帧.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ GOP(Group of Pictures)是一组连续的画面,由一张I帧和数张B/P帧组
2626

2727
**编码器将多张图像进行编码后生产成一段一段的 GOP ( Group of Pictures ) , 解码器在播放时则是读取一段一段的 GOP 进行解码后读取画面再渲染显示。**GOP ( Group of Pictures) 是一组连续的画面,由一张 I 帧和数张 B / P 帧组成,是视频图像编码器和解码器存取的基本单位,它的排列顺序将会一直重复到影像结束。I 帧是内部编码帧(也称为关键帧),P帧是前向预测帧(前向参考帧),B 帧是双向内插帧(双向参考帧)。简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。如果没有 I 帧,P 帧和 B 帧就无法解码。
2828

29+
GOP是指一组连续的图像,由一个I帧和多个B/P帧组成,是编解码器存取的基本单位。GOP结构常用的两个参数为M和N,M用于指定GOP中首个P帧和I帧之间的距离,N用于指定一个GOP的大小。例如M=1,N=15,GOP结构为IPBBPBBPBBPBBPB IPBBPBB。GOP指两个I帧之间的距离,Reference指两个P帧之间的距离。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧,所以在码率不变的前提下,GOP值越大,P、B帧的数量就会越多,平均每个I、P、B帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference越大,B帧的数量就越多,同理也更容易获得较好的图像质量。需要说明的是,通过提高GOP值来提高图像质量是有限度的,在遇到场景切换的情况时,H.264编码器会自动强制插入一个I帧,此时实际的GOP值被缩短了。
30+
31+
另一方面,在一个GOP中,P、B帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续P、B帧的图像质量,直到下一个GOP开始才有可能得以恢复,所以GOP值也不宜设置得过大。同时,由于P、B帧的复杂度大于I帧,所以过多的P、B帧会影响编码效率,使编码效率降低。另外,过长的GOP还会影响Seek操作的响应速度,由于P、B帧是由前面的I或P帧预测得到的,所以Seek操作需要直接定位,在解码某个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,Seek响应的时间也越长。
32+
33+
GOP的形式通常有两种,包括闭合式GOP和开放式GOP。闭合式GOP只需参考本GOP内的图像,而不需参考前后GOP的数据。这种模式决定了闭合式GOP的显示顺序总是以I帧开始而以P帧结束。开放式GOP中的B帧解码时可能要用到其前一个GOP或后一个GOP的某些帧。码流中包含B帧的时候才会出现开放式GOP。
34+
35+
2936
### IDR
3037

3138
IDR(Instantaneous Decoding Refresh)是H.264视频编码中的一种特殊的I帧。它包含了所有的视频序列信息,并且通过强制性地要求解码器重新初始化来保证解码正确性。IDR通常用于视频流中断或丢失时,重新恢复视频流的一种方式。
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
## AVI
2+
3+
音频视频交错(Audio Video Interleaved,AVI)格式,是一门成熟的老技术,尽管国际学术界公认AVI已经属于被淘汰的技术,但是简单易懂的开发API,还在被广泛使用。AVI符合RIFF(ResourceInterchange File Format)文件规范,使用四字符码(Four-Character Code,FOURCC)表征数据类型。AVI的文件结构分为头部、主体和索引3部分。主体中图像数据和声音数据是交互存放的,从尾部的索引可以索引到想放的位置。AVI本身只提供了这么一个框架,内部的图像数据和声音数据格式可以是任意的编码形式。因为索引放在了文件尾部,所以在播放网络流媒体时已力不从心。例如从网络上下载AVI文件,如果没有下载完成,则很难正常播放出来。
4+
5+
6+
AVI中有两种最基本的数据单元,一个是Chunks,另一个是Lists,结构体如下:
7+
8+
```c++
9+
// Chunks
10+
typedef struct {
11+
DWORD dwFourcc;
12+
DWORD dwSize; // data
13+
BYTE data[dwSize]; // contains headers or audio/video data
14+
} CHUNK;
15+
16+
// Lists
17+
typedef struct {
18+
DWORD dwList;
19+
DWORD dwSize;
20+
DWORD dwFourCC;
21+
BYTE data[dwSize - 4];
22+
} LIST;
23+
```
24+
25+
由如上代码可知,Chunks数据块由一个四字符码、4B的data size(指下面的数据大小)及数据组成。Lists由4部分组成,包括4B的四字符码、4B的数据大小(指后面列的两部分数据大小)、4B的list类型及数据组成。与Chunks数据块不同的是,Lists数据内容可以包含字块(Chunks或Lists)。
26+
27+
28+
29+
30+
31+

0 commit comments

Comments
 (0)