Skip to content

Commit 5f18edd

Browse files
committed
update notes
1 parent 98afb02 commit 5f18edd

File tree

11 files changed

+540
-47
lines changed

11 files changed

+540
-47
lines changed

VideoDevelopment/CDN及PCDN.md

Lines changed: 114 additions & 33 deletions
Large diffs are not rendered by default.

VideoDevelopment/DLNA简介.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ DLNA
1717
`DLNA`的骨干成员包括以Intel为首的芯片制造商;以HP为首的PC制造商,以Sony,Panasonic,Sharp,Samsung,LG 为首的家电、消费电子制造商;以CISCO,HUWEI,MOTOROLA,ERICSSON为首的电信设备/移动终端/标准商;一家独大的Microsoft软件/操作系统商等等。
1818

1919
值得注意的有几点:
20-
20+
2121
1. DLNA这个东西基本Intel,Microsoft两个领域巨头在推,一个搞芯片,一个搞系统。AMD没出现在2011的promoter名单中;Google来年会不会掺一脚不好说。还有QUALCOMM也参加进来了,这几年的智能手机芯片处理器他家的也比较多,而且他家还有很多专利可以吃。
2222

2323
2. 2011就剩HP一个大PC商了,其他大PC商如Acer,Asus都还不是promoter,他们肯定要抢着加入的。lenovo不仅从promotor名单中消失了,自然也不会是contributor了,和AMD一样。最开始时lenovo是很积极的,在DHWG的时候也是骨干成员,回来中国搞了一个“IGRS闪联”,退出的原因不知道和这个有没有关系。IGRS在很大程度上和DLNA是比较类似的,框架协议和UPnP也是比较像的。
@@ -122,11 +122,12 @@ DLNA架构分为如下图7个层次:
122122
- 从DMS/M-DMS至DMP/M-DMP,即使不立即播放。
123123
- 从一个DMS到另一个DMS,这时接收方DMS播放接收媒体内容,表现为一个DMP;也可以不立即播放,可能只是存储或者处理。
124124

125+
125126
传输 模式有三种:
126127
- 流传输。当DMR/DMP需要实时渲染接收媒体,媒体具时序性。
127128
- 交互传输。不包含时序的媒体,如图片传输。
128-
- 后台传输。非实时的媒体传输,比如上传下载等。
129-
129+
- 后台传输。非实时的媒体传输,比如上传下载等。
130+
130131
6. Media Formats媒体格式。格式Formats在这里等同于编码格式Codec,平时我们说的编码格式比如Mpeg-2,AVC,x264就是视频编码格式;PCM,mp3(MPEG-2 Layer 3),aac,flac就是音频编码格式。而avi,rmvb,mkv这些是媒体封装格式,包含视频音频可能还有字幕流。比如一个常见的后缀为mkv的文件,它的视频Codec是x264,音频是aac,它的视音频编码属于Mpeg-4 Codec Family。
131132

132133
7. Remote UI 远程用户接口。
@@ -170,7 +171,7 @@ http://upnp.org/
170171
填"M-SEARCH * HTTP/1.1/r/n"就是要搜索了;respone别人的搜索就填"HTTP/1.1 200 OK/r/n"。
171172

172173
SSDP第二个要填充的字段是目的地址HOST。比如填上"HOST: 239.255.255.250:1900",就是组播(multicast)搜索,这里239.255.255.250是组播地址,就是说这条消息会给网络里面该组地址的设备发,1900是SSDP协议的端口号。如果HOST地址是特定地址,那这就是单播(unicast)。Respone不填这个字段,他会在ST字段里面填respone address,就是发来搜索信息的设备的地址,Respone消息的话还会发送一个包含自己地址URL的字段,Respone的意思就是跟Searcher说:我好像是你要找的人,我的电话是XXX,详细情况请CALL我。Respone也是UDP单播。
173-
174+
174175
3. 描述(Description)
175176

176177
前面我们说了CP想要一个device更详细的信息,就打给它的URL跟它要。返回来的东西一般是个XML(Extensible Markup Language,是种结构化的数据。和HTML比较像,有tag和data,具体不说了自己去查),描述分为两部分:一个是device description,是device的物理描述,就是说这个device是什么;还有一个是service descriptions,就是device的服务描述了,就是device能干些什么。这些device和device service的描述的格式也是有要求的,开发商也可以自定义,只要符合UPnP Forum的规范。
File renamed without changes.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
P2P原理_NAT穿透
2+
===
3+
4+
5+
6+
### NAT
7+
8+
NAT(Network Address Translation,网络地址转换),也叫做网络掩蔽或者IP掩蔽。NAT是一种网络地址翻译技术,主要是将内部的私有IP地址(private IP)转换成可以在公网使用的公网IP(public IP)。
9+
10+
11+
12+
网络地址转换,就是替换IP报文头部的地址信息。NAT通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力。那么,什么是内部网络IP地址?
13+
14+
[RFC1918](https://datatracker.ietf.org/doc/rfc1918/)规定了三个保留地址段落:10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255。这三个范围分别处于A,B,C类的地址段,不向特定的用户分配,被IANA作为私有地址保留。这些地址可以在任何组织或企业内部使用,和其他Internet地址的区别就是,仅能在内部使用,不能作为全球路由地址。这就是说,出了组织的管理范围这些地址就不再有意义,无论是作为源地址,还是目的地址。对于一个封闭的组织,如果其网络不连接到Internet,就可以使用这些地址而不用向IANA提出申请,而在内部的路由管理和报文传递方式与其他网络没有差异。
15+
16+
对于有Internet访问需求而内部又使用私有地址的网络,就要在组织的出口位置部署NAT网关,在报文离开私网进入Internet时,将源IP替换为公网地址,通常是出口设备的接口地址。一个对外的访问请求在到达目标以后,表现为由本组织出口设备发起,因此被请求的服务端可将响应由Internet发回出口网关。出口网关再将目的地址替换为私网的源主机地址,发回内部。这样一次由私网主机向公网服务端的请求和响应就在通信两端均无感知的情况下完成了。依据这种模型,数量庞大的内网主机就不再需要公有IP地址了。
17+
18+
那么,NAT与此同时也带来一些弊端:首先是,NAT设备会对数据包进行编辑修改,这样就降低了发送数据的效率;此外,各种协议的应用各有不同,有的协议是无法通过NAT的(不能通过NAT的协议还是蛮多的),这就需要通过穿透技术来解决。我们后面会重点讨论穿透技术。
19+
20+
21+
22+
**虽然实际过程远比这个复杂,但上面的描述概括了NAT处理报文的几个关键特点:**
23+
24+
25+
26+
- 1)网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关;
27+
- 2)网络访问只能先由私网侧发起,公网无法主动访问私网主机;
28+
- 3)NAT网关在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;
29+
- 4)NAT网关的存在对通信双方是保持透明的;
30+
- 5)NAT网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。
31+
32+
33+
34+
简单的背景了解过后,下面介绍下NAT实现的主要方式,以及NAT都有哪些类型。
35+
36+
37+
38+
### NAT的实现方式
39+
40+
41+
42+
- 静态NAT: 就是静态地址转换。是指一个公网IP对应一个私有IP,是一对一的转换,同时注意,这里只进行了IP转换,而没有进行端口的转换。
43+
44+
- NAPT: 端口多路复用技术。与静态NAT的差别是,NAPT不但要转换IP地址,还要进行传输层的端口转换。具体的表现形式就是,对外只有一个公网IP,通过端口来区别不同私有IP主机的数据。
45+
46+
47+
48+
49+
50+
51+
52+
53+
54+
55+
56+
57+
58+
59+
60+
61+
62+
63+
64+
65+
66+
67+
68+
---
69+
70+
- 邮箱 :charon.chui@gmail.com
71+
- Good Luck!

VideoDevelopment/关键帧.md

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
11
关键帧
22
===
33

4-
MP4是一种格式的规范,这个规范是被ISO机构认证的,你如果要生成一个mp4文件,就必须按照这个规矩来
4+
**编码器将多张图像进行编码后生产成一段一段的 GOP ( Group of Pictures ) , 解码器在播放时则是读取一段一段的 GOP 进行解码后读取画面再渲染显示。**GOP ( Group of Pictures) 是一组连续的画面,由一张 I 帧和数张 B / P 帧组成,是视频图像编码器和解码器存取的基本单位,它的排列顺序将会一直重复到影像结束。I 帧是内部编码帧(也称为关键帧),P帧是前向预测帧(前向参考帧),B 帧是双向内插帧(双向参考帧)。简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。如果没有 I 帧,P 帧和 B 帧就无法解码
55

6-
7-
视频压缩中,每一帧代表一副静止的图像,在实际的压缩时,会采取各种算法来减少数据的容量。视频压缩采用的方法是分组,把几帧图像分为一组(GOP(Group of picture)).其中IPB是最常见的。
6+
在H.264压缩标准中I帧、P帧、B帧用于表示传输的视频画面。
87

98
- I帧(Intra coded picture):帧内编码图像帧简称关键帧,这一帧画面的完整保留,解码时只需要本帧数据就可以完成.I帧通常是每个GOP(MPEG所使用的一种视频压缩技术)的第一个,GOP就是指两个I帧之间的距离。
109

11-
这里有一个IDR帧的概念需要讲一下,所有的IDR帧都是I帧,但是并不是所有I帧都是IDR帧,IDR帧是I帧的子集。I帧严格定义是帧内编码帧,由于是一个全帧压缩编码帧,通常用I帧表示「关键帧」。IDR是基于I帧的一个扩展,带了控制逻辑,IDR图像都是I帧图像,当解码器解码到IDR图像时,会立即将参考帧队列清空,将已解码的数据全部输出或抛弃。重新查找参数集,开始一个新的序列。这样如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。在H.264编码中,GOP是封闭式的,一个GOP的第一帧都是IDR帧。
12-
13-
我们在做直播的时候,想要能达到秒开的效果,因为I帧是能不依赖其他帧独立完成解码的,这就意味着当播放器接收到I帧就能立马渲染出来,而接收到P、B帧则需要等待依赖的帧而不能立马完成解码和渲染,这个期间就会黑屏,所以可以在服务端通过缓存GOP,保证播放端在接入直播时能先获取到I帧马上渲染出画面,从而提高起播速度。在直播服务器中,支持设置一个cache,用于存放GOP,直播服务器缓存了当前的GOP序列,当播放端请求数据的时候,CDN会从I帧返回给客户端,从而保证客户端可以快速进行播放。当然由于缓存的是之前的视频信息,当音频数据到达播放端后,为了音视频同步播放器会进行视频的快进处理。
10+
我们在做直播的时候,想要能达到秒开的效果,因为I帧是能不依赖其他帧独立完成解码的,这就意味着当播放器接收到I帧就能立马渲染出来,而接收到P、B帧则需要等待依赖的帧而不能立马完成解码和渲染,这个期间就会黑屏,所以可以在服务端通过缓存GOP,保证播放端在接入直播时能先获取到I帧马上渲染出画面,从而提高起播速度。在直播服务器中,支持设置一个cache,用于存放GOP,直播服务器缓存了当前的GOP序列,当播放端请求数据的时候,CDN会从I帧返回给客户端,从而保证客户端可以快速进行播放。当然由于缓存的是之前的视频信息,当音频数据到达播放端后,为了音视频同步播放器会进行视频的快进处理。
1411

1512
- P帧(Predictive coded picture):预测编码图像帧简称差别帧,这一帧跟之前的一个关键帧或P帧的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终的画面。也就是说P帧没有完整的画面数据,只有与前一帧的画面差别的数据。
1613
- B帧(Bidirectionally predicted picture):双向预测编码图像帧简称双向差别帧,也就是B帧记录的是本帧与前后帧的差别。也就是要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面与本帧数据的叠加来获取最终的画面。B帧压缩率高,但是解码时会更耗CPU。
1714
- GOP(Group of Pictures)是一组连续的画面,由一张I帧和数张B/P帧组成,是视频图像编码器和解码器存取的基本单位,它的排列顺序将会一直重复到影像结束。
18-
编码器将多张图像进行编码后生产成一段一段的 GOP ,解码器在播放时则是读取一段一段的GOP进行解码后读取画面再渲染显示。
15+
编码器将多张图像进行编码后生产成一段一段的 GOP ,解码器在播放时则是读取一段一段的GOP进行解码后读取画面再渲染显示。
1916

17+
- IDR(Instantaneous Decoding Refresh)--即时解码刷新。
18+
I帧:帧内编码帧是一种自带全部信息的独立帧,无需参考其它图像便可独立进行解码,视频序列中的第一个帧始终都是I帧。
19+
I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。 IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。 IDR会导致DPB(DecodedPictureBuffer 参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。
20+
对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧 。
21+
收到 IDR 帧时,解码器另外需要做的工作就是:把所有的 PPS 和 SPS 参数进行更新。
22+
对IDR帧的处理(与I帧的处理相同):(1) 进行帧内预测,决定所采用的帧内预测模式。(2) 像素值减去预测值,得到残差。(3) 对残差进行变换和量化。(4) 变长编码和算术编码。(5) 重构图像并滤波,得到的图像作为其它帧的参考帧。
23+
多参考帧情况下, 举个例子 :有如下帧序列: IPPPP I P PPP ……。按照 3 个参考帧编码。
24+
因为“按照 3 个参考帧编码”,所以参考帧队列长度为 3 。
25+
遇到第二个 I 时,并不清空参考帧队列,把这个 I 帧加入参考帧队列(当然 I 编码时不用参考帧。)。再检测到其后面的 P 帧时,用到之前的 PPI 三帧做参考了。
2026

27+
![](https://raw.githubusercontent.com/CharonChui/Pictures/master/video_frame_ipb.jpg)
2128

2229
### 数据压缩比
2330

@@ -31,6 +38,23 @@ P帧和B帧极大的节省了数据量,节省出来的空间可以用来多保
3138

3239

3340

41+
【为什么会有PTS和DTS的概念】
42+
43+
通过上面的描述可以看出:P帧需要参考前面的I帧或P帧才可以生成一张完整的图片,而B帧则需要参考前面I帧或P帧及其后面的一个P帧才可以生成一张完整的图片。这样就带来了一个问题:在视频流中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致了,顺序打乱了,那这些帧该如何播放呢?这时就引入了另外两个概念:DTS 和 PTS。
44+
45+
【PTS和DTS】
46+
47+
先来了解一下PTS和DTS的基本概念:
48+
49+
DTS(Decoding Time Stamp):即**解码时间戳**,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
50+
PTS(Presentation Time Stamp):即**显示时间戳**,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
51+
52+
虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。
53+
54+
在视频采集的时候是录制一帧就编码一帧发送一帧的,在编码的时候会生成 PTS,这里需要特别注意的是 frame(帧)的编码方式,在通常的场景中,编解码器编码一个 I 帧,然后向后跳过几个帧,用编码 I 帧作为基准帧对一个未来 P 帧进行编码,然后跳回到 I 帧之后的下一个帧。编码的 I 帧和 P 帧之间的帧被编码为 B 帧。之后,编码器会再次跳过几个帧,使用第一个 P 帧作为基准帧编码另外一个 P 帧,然后再次跳回,用 B 帧填充显示序列中的空隙。这个过程不断继续,每 12 到 15 个 P 帧和 B 帧内插入一个新的 I 帧。P 帧由前一个 I 帧或 P 帧图像来预测,而 B 帧由前后的两个 P 帧或一个 I 帧和一个 P 帧来预测,因而编解码和帧的显示顺序有所不同
55+
56+
57+
3458

3559

3660

VideoDevelopment/播放器性能优化.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,14 @@ DNS解析加快,通常,DNS解析,意味着要把一个域名为xxx.com解
6464

6565
#### 预加载
6666

67-
预加载能减少首次缓冲号码,但是预加载不能和当前播放的视频抢下载带宽,需要达到一个合适的阈值再开始下载。
67+
预加载能减少首次缓冲时间,但是预加载不能和当前播放的视频抢下载带宽,需要达到一个合适的阈值再开始下载。
6868

6969
优先保证封面图等信息完成后再根据云控的当前缓冲的时长等信息来控制是否要启动预加载
7070

7171
#### PCDN
7272

7373
有关CDN相关可参考[CDN及PCDN](https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/CDN%E5%8F%8APCDN.md)
7474

75-
7675
---
7776

7877
- 邮箱 :charon.chui@gmail.com

VideoDevelopment/流媒体协议/流媒体通信协议.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
流媒体通信协议
22
===
33

4-
54
流媒体(Streaming Media)是指采用流式传输技术在网络上连续实时播放的媒体格式,如音频、视频或多媒体文件,采用流媒体技术使得数据包得以像流水一样发送, 如果没有流媒体技术, 那么我们就要像以前用迅雷下电影一样, 下载整个影片才能观看。
65

76

87

8+
HTTP
9+
---
10+
11+
12+
13+
HTTP 视频协议是在互联网普及之后在互联网上看视频的需求下形成的。最初的 HTTP 视频协议,没有任何特别之处,就是通用的 HTTP 文件渐进式下载,但是在这种情况下,视频无法快进或者跳转到文件尚未被下载到的部分,这就对 HTTP 协议提出了范围请求(Range Request)的要求,目前几乎所有 HTTP 服务器都支持范围请求。所谓范围请求指的是请求文件的部分数据,这可以在 HTTP 请求头中通过 Range 字段设置偏移量来实现。
14+
15+
这种方式应用于视频点播还可以,用于直播的话实时性较差,延迟也很高,于是,苹果公司又在 HTTP 协议的基础上推出了 HTTP Live Streaming(简称 HLS)这个流媒体传输协议。
16+
17+
18+
919
RTP
1020
---
1121

0 commit comments

Comments
 (0)