音视频(一)基本开发概念

播放流程

简单理解封装格式

相当与将媒体文件是一个容器封装->音频流,视频流,字幕流

可以有多个视频流,也可以有多个音频流。通常有两种形式:

  1. 单独的字幕流,单独的音视频流
  2. 字幕流+视频流 合成流

简单理解解封装(解复用,打开封装格式)

-> 视频压缩数据(标准格式等,代表性H.264,H.265)
-> 视频解压播放(视频解码)
-> 原始数据YUV等
-》 YUV转换RGBA

-> 音频压缩数据(AAC,mp3,AC-3)
-> 音频解压播放(音频解码)
-> 原始数据PCM等
-》音频重新采样(双声道转单声道等声道转换)

一般需要考虑问题 -> 音视频同步 

编码流程

采集图像数据
摄像头->采集RGBA-> 转换YUV-> 编码器编码YUV数据->H.264等格式压缩数据


封包xxx.mp4 封装格式,封装操作

采集音频数据
喇叭音频输入->音频采集->PCM数据-》AAC等压缩数据-》封包

编码的目的:去除冗余信息。

去掉冗余信息(可以理解成数据格式压缩)视频太大,完整不处理200GB的视频,编码后可能1G左右

编码的目的,就是为了压缩。各种视频编码方式,都是为了让视频变得体积更小,有利于存储和传输。编码的 核心思想就是去除冗余信息。

了解冗余信息分类

  1. 空间冗余=相邻像素重复

空间冗余:图像内部相邻像素之间存在较强的相关性多造成的冗余。

如:20x20 个像素,重复一样,那么只保留1个就好,因为剩下都是相似

  1. 时间冗余=帧之间的差值

时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余。

如:两张人像图片过度,只有眼睛发生变化,第二帧只要保留眼睛信息,参考第一帧。得到完整的第二帧图像。

  1. 视觉冗余=人类不敏感的颜色:(轻微的偏差和饱和度不敏感)

视觉冗余:是指人眼不能感知或不敏感的那部分图像信息。

如:深红色和浅红色还能分辨,会容易察觉,对亮度敏感。红色偏一点点橘红色,人眼就不容易察觉

  1. 信息熵冗余= 熵编码-哈夫曼算法等

信息熵冗余:也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特 数要大,它们之间的差距就是信息熵冗余,或称编码冗余。

  1. 知识冗余=人类(头,身体,腿),汽车,房子不需要记录

知识冗余:是指在有些图像中还包含与某些验证知识有关的信息。

I 帧,B帧,P帧

I帧: 帧内编码帧,关键帧,I帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像; (压缩率最低)
P帧:前向预测/参考 编码帧,记录了本帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画 面叠加上本帧定义的差别,生成最终画面。 (压缩率比I帧高,比B帧低 属于 适中情况)
B帧:双向预测/参考 编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或者P帧,同时也需要 后面的P帧才能解码一张完整的图像。 (参考前后的预测得到的,压缩率是最高,但是耗时))

图形学中基础经典的展示


所以作为直播的话,虽然B帧的压缩率最高,延时也比较高,在不考虑宽带费用的情况下会尽量减少B帧。为了观看的流畅度和体验。

编码统一名称

H.264 == MPEG-4 - AVC
H.265 == HEVC [H.264基础上 加入了更多的算法 == 压缩的更小]

H.264分层结构(VCL与NAL)

VCL :

VCL(Video Coding Layer,视频编码层):负责高效的视频内容表示, VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。

NAL :

NAL(Network Abstraction Layer,网络提取层):负责以网络所要求的恰当的方式对数据进行打包和传送
是传输层。不管在本地播放还是网络播放,都要通过这一层来传输。
VCL就是被压缩编码后原始数据,在VCL数据封装到NAL单元中之后,才可以用于传输或存储。

数据传输:

无论是后端还是前端,数据传输过程都是遵循一个流程:

数据 → JavaBean → 序列化(Json)→ HTTP →

 ↓
TCP  传输
 ↓    

数据 ← JavaBean ←序列化(Json)← HTTP ←

数据封装到NAL单元中之后传输类似

图片 → 编码(VCL) → 打包(NAL)→ HTTP →

 ↓
TCP  传输
 ↓    

图片 ← 解码(VCL) ← 解包(NAL))← HTTP ←

NAL片(宏块)

一系列NAL每个NAL之间有规则的间隔,序列开头有起始码

一帧图片经过 H.264 编码器之后,NAL单元就是装载着这些片(被编码为一个或多个片 slice), 每片包 含整数个宏块(至少一个宏块,最多包含整个图像宏块)。

  1. 一般H.264编码器的默认输出为:起始码+NALU(Nal单元)。起始码为:0x00000001或者0x000001。

每一个NALU都需要分隔,要分隔帧操作,就相对于写文章断句一样,这样才方便解析操作

  1. 其中每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x00|0001(3Byte)或者0x0000|0001(4Byte)

0x00000001 起始码代表:一个NALU里面有很多片。
0x000001 起始码代表: 一个NALU里面一个片可以搞定。

NALU 包含:起始码(两种)+ 1个字节Nal Header + 其他字节负荷数据EBSP数据集

  nal_unit_type. 这个NALU单元的类型,1~12由H.264使用,24~31由H.264以外的应用使用,简述如下:

  0     没有定义
  1-23  NAL单元  单个 NAL 单元包
  1     不分区,非IDR图像的片
  2     片分区A
  3     片分区B
  4     片分区C
  5     IDR图像中的片
  6     补充增强信息单元(SEI)
  7     SPS
  8     PPS
  9     序列结束
  10    序列结束
  11    码流借宿
  12    填充
  13-23 保留

  24    STAP-A   单一时间的组合包
  25    STAP-B   单一时间的组合包
  26    MTAP16   多个时间的组合包
  27    MTAP24   多个时间的组合包
  28    FU-A     分片的单元
  29    FU-B     分片的单元
  30-31 没有定义

文件头部分析类型:低五位的16进制的值,参照表可以查询数据类型

1. SPS 序列参数集(记录有多少I,B,P,如何排列),打开一个264文件分析(可以用iHex或者010 Editor)

00 00 00 01 67  → 二进制01100111 → 取低五位 000 00111 → 16进制 0x07 → 查表 :SPS
67 就是head

一个字节八位
0 1 1 0 0 1 1 1
分组

0(第一组,这个帧可以用0,不可以用1)丨 11(第二组,11 代表这个帧很重要)丨00111 (第三组低五位,类型)

第一组:1代表这个帧不可以用,0代表可以用
第二组:11 代表很重要
第三组:00111 查表 SPS

PPS 图像参数集(记录图像宽高信息)

    00 00 00 01 68  → 二进制0x68 0110 1000  → 取低五位 01000  → 16进制0x08  → 查表:PPS

SEI 这种是短的,补充信息单元。记录坐标信息,人员信息等

  00 00 01 06  → 0x06 00000110  → 低五位0x06  →查表:补充增强信息单元(SEI)可有可无

      00 00 00 65  → 0110 0101  → 00101  → 0x05 → 查表:(IDR图像中的片)

      00 00 01 41  → 0x41 :0100 0001 (不重要P帧)  →   0x01 →  查表: (NAL单元  单个 NAL 单元包)

0x01 == 普通P帧 和 重要P帧 ,还有B帧

  00 00 01 61 → (重要P帧)→  0x61:0110 0001 → 0x01(多了一个1 ---0110)
  00 00 01 01 → (B帧)→ 0000 0001→ 0x01 0x01 (前面全是0---0000)

开发中,SPS,PPS ,I帧 分析这三个比较多

查询无法播放等原因,可以考虑查看头是否确实信息,SPS,PPS ,I帧

PTS 与 DTS

DTS 解码时间戳,在什么时解码这一帧

PTS表示显示时间戳,什么时候显示这一帧

没有B帧的情况,DTS和PTS输出顺序是一样的。

因为B帧打乱了解码和显示的顺序(要解码B帧需要先解码后面的P帧),所以一旦存在B帧,PTS和DTS就会不 同。

I帧 p b p b p b.... I帧 p b p b p b ...

SPS+PPS+两个I帧之间所有帧分(包括前面的I帧)为一组GOP

解析B帧的时候,B帧后面的p帧要是没有是不是就莫法解析了, B 必须保证 前后帧解码了,我才能参考

开发参考模型

一个线程:解码
一个队列 解码数据加入队列, 从队列取出数据 (缓冲数据的作用)
一个线程:播放
41 61 1 基本上都是P帧
01 1 基本上都是B帧
B,P帧数的字节小,B帧是最小的
高2-3位:11代表重要的P帧,10表示适中不重要的P帧,00表示不重要的帧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 155,770评论 4 358
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,116评论 1 286
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 105,656评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,372评论 0 201
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,704评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,166评论 1 204
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,535评论 2 306
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,259评论 0 193
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,882评论 1 236
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,218评论 2 239
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,760评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,126评论 2 249
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,667评论 3 228
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,935评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,644评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,171评论 2 265
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,119评论 2 258

推荐阅读更多精彩内容