Android音视频视频基础(H264)二 SPS分析
学习目标:
SPS分析与读取
图中的标识为哥伦布编码的,均需要通过哥伦布编码解析实际值。
学习内容:
首先肯定得截个sps数据的图来看分析了。
上图红框内就是sps数据了。67
是sps标识,不清楚的小伙伴可以阅读下面的博客
Android音视频视频基础(H264)
接下来我们把数据都一对一的转成二进制,这里就不全部写下来了。
十六进制 | 二进制 |
---|---|
67 | 0110 0111 |
64 | 0110 0100 |
00 | 0000 0000 |
15 | 0001 0101 |
AC | 1010 1100 |
D9 | 1101 1001 |
41 | 0100 0001 |
70 | 0111 0000 |
C6 | 1100 0110 |
首先,我们可以看到帧标识670110 0111
,读过我之前的基础篇的同学应该知道,这里的8个比特位不全部用来标识sps,只有其中的5位才会被用来做标识位,那其他三位呢?看下图
接下来看下面一位640110 0100
,这一位表示编码等级
(profile_idc)
profile_idc: 编码等级 有以下取值
Options: | 解释 |
---|---|
66 | Baseline(直播) |
77 | Main(一般场景,默认的编码等级) |
88 | Extended |
100 | High (FRExt) |
110 | High 10 (FRExt) |
122 | High 4:2:2 (FRExt) |
144 | High 4:4:4 (FRExt) |
接下来看下面一位000000 0000
,这一位表示约束标志,注意:当constraint_set0_flag,constraint_set1_flag或constraint_set2_flag中不只一个值为1的话,那么码流必须满足所有相应指明的profile约束。
接下来就是150001 0101
,他是每帧最大支持码流范围(level_idc
)。标识当前码流的Level,编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。
Options | |
---|---|
10 | 1 (supports only QCIF format and below with 380160 samples/sec) |
11 | 1.1 (CIF and below. 768000 samples/sec) |
12 | 1.2 (CIF and below. 1536000 samples/sec) |
13 | 1.3 (CIF and below. 3041280 samples/sec) |
20 | 2 (CIF and below. 3041280 samples/sec) |
21 | 2.1 (Supports HHR formats. Enables Interlace support. 5 068 800 samples/sec) |
22 | 2.2 (Supports SD/4CIF formats. Enables Interlace support. 5184000 samples/sec) |
30 | 3 (Supports SD/4CIF formats. Enables Interlace support. 10368000 samples/sec) |
31 | 3.1 (Supports 720p HD format. Enables Interlace support. 27648000 samples/sec) |
32 | 3.2 (Supports SXGA format. Enables Interlace support. 55296000 samples/sec) |
40 | 4 (Supports 2Kx1K format. Enables Interlace support. 62914560 samples/sec) |
41 | 4.1 (Supports 2Kx1K format. Enables Interlace support. 62914560 samples/sec) |
42 | 4.2 (Supports 2Kx1K format. Frame coding only. 125829120 samples/sec) |
50 | 5 (Supports 3672x1536 format. Frame coding only. 150994944 samples/sec) |
51 | 5.1 (Supports 4096x2304 format. Frame coding only. 251658240 samples/sec) |
接下来就是AC1010 1100
,如下图
chroma_format_idc
的值应该在 0到 3的范围内(包括 0和 3)。当 chroma_format_idc不存在时,应推断其值为 1(4:2:0的色度格式)。
bit_depth_luma_minus8
:
- 0 : High 只支持8bit
- 1 : High10 才支持10bit
接下来就是D9和41和70和C6,如下图
追加内容
哥伦布编码
哥伦布编码的规则是从左到右编码,1为墙,墙左边的0的个数即是你的数据的比特位个数,你的数据在墙右边。
0阶无符号指数哥伦布编码过程
假如我们待编码的数字codeNum = 4,0阶无符号指数哥伦布编码的步骤如下:
- 将codeNum+1,4+1=5
- 将加1后的数字用二进制表示,5的二进制位101,1后缀=101,后缀位01,长度2
- 前缀与后缀长度相同,在前面加上2个0
所以结果为00101
再来一些例子:
codeNum | codeNum+1 | codeNum+1的二进制 | 需补前缀0的个数 | 编码后的比特串(红色表示补的前缀0) |
---|---|---|---|---|
0 | 1 | 1 | 0 | 1 |
1 | 2 | 10 | 1(0) | 010 |
2 | 3 | 11 | 1(0) | 011 |
3 | 4 | 100 | 2(00) | 00100 |
4 | 5 | 101 | 2(00) | 00101 |
5 | 6 | 110 | 2(00) | 00110 |
6 | 7 | 111 | 2(00) | 00111 |
0阶无符号指数哥伦布编码解析过程
- 找到第一个不为0的bit,并记录总共找到了0的个数(num),这个时候读到的这个bit肯定是1
- 然后读num个后缀
- 1后缀转变成十进制就是原来的codeNum,codeNum = (1 << num) + 后缀(十进制) - 1;
比如二进制为:00111
,首先找到第一个不为0的比特1
,前面0的个数为2,然后再读2个后缀11,11十进制为3,这个时候codeNum = (1 << 2) + 3 - 1 = 4 + 3 - 1 = 6
k阶无符号指数哥伦布编码过程
将codeNum加上2^k
将加上2^k的数字用二进制表示
计算二进制的长度len,然后再前面加上len-1-k个0
假如我们待编码的数字codeNum = 4,k阶无符号指数哥伦布编码的步骤如下(加入这里 k=1):
- 4 + 2^1,4+2=6(110)
- len -1 - k = 3 - 1 - 1 = 1
- 在前面加上1个0,所以结果为
0110
再来一些例子:
codeNum | k=1 | len-1-k | 编码后比特串 | k=2 | len-1-k | 编码后比特串 |
---|---|---|---|---|---|---|
1 | 1+2^1=3(11) | 2-1-1=0 | 11 | 1+2^2=5(101) | 3-1-2=0 | 101 |
2 | 2+2^1=4(100) | 3-1-1=1 | 0100 | 2+2^2=6(110) | 3-1-2=0 | 110 |
3 | 3+2^1=5(101) | 3-1-1=1 | 0101 | 3+2^2=7(111) | 3-1-2=0 | 111 |
4 | 4+2^1=6(110) | 3-1-1=1 | 0110 | 4+2^2=8(1000) | 4-1-2=1 | 01000 |
Android音视频视频基础(H264)二 SPS分析相关推荐
- 音视频开发基础(二)常用的直播协议
如今网络的发展已经从1G,2G,3G,4G逐渐过渡到5G,5G网络的出现,音视频的使用就变得越来越广.从以前的泛娱乐过渡到了更深次的领域,比如在线教育,在线会议-然而,要想有完美的视屏体验,还是要从很 ...
- Android近场通信---NFC基础(二)(转)
转自 http://blog.csdn.net/think_soft/article/details/8171256 应用程序如何调度NFC标签 当标签调度系统完成对NFC标签和它的标识信息封装的In ...
- 基于Android的计步器(Pedometer)的讲解(二)——柱状图分析2
早上第二大节有课,所以没有来得及仔细看这个例子,中午回来将这个例子写完了,现在柱状图有两个实现的方式了,一个是之前博客提到的,一个就是现在这个. 这个柱状图也实现了动态的增长,和点击显示相应柱状图的数 ...
- Android音视频【一】H264编码基础
人间观察 岁月催人,时间过的太快了 音视频编码解码就是指通过特定的压缩/解压技术,将某个音视频格式的数据转换为另一种音视频格式数据.目前在Android中的音视频用的最多的就是H264+aac的方式进 ...
- Android音视频视频基础(H264)
学习目标: Android音视频 H265和H264官方文档下载 视频分析软件,记得下载,下文分析的视频软件就靠它了 码流查看器 ffmpeg 提取视频命令:ffmpeg.exe -i input1. ...
- 【Android 音视频开发-音视频硬解码篇】1.音视频基础知识
这是一个入门系列,涉及的知识也仅限于够用. 最后,写文章过程中,会借鉴参考其他人分享的文章,会在文章最后列出,感谢这些作者的分享. 本文你可以了解到 作为开篇的文章,我们先来看看音视频由什么构成的,以 ...
- 音视频开发总结之二Android平台相关
一. 音视频采集流程 串联整个音视频录制流程,完成音视频的采集.编码.封包成 mp4 输出. 通过摄像头和麦克风获得实时的音视频数据: 播放流程: 获取流->解码->播放. 录制播放路程: ...
- Android音视频开发基础(六):学习MediaCodec API,完成视频H.264的解码
前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了<Android 音视频从入门到提高 - 任务列表>.本文是Android音视 ...
- Android音视频学习系列(六) — 掌握视频基础知识并使用OpenGL ES 2.0渲染YUV数据
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
最新文章
- vue 可合并表格组件_merge-table
- rediscluster全局数据_设计数据密集型应用(6-7):分片、事务
- linux内核内存管理的三个阶段分析
- ★ 科幻分离式手机 富士通F-04B详细图解 ★
- 论文阅读|How Does Batch Normalization Help Optimization
- oracle 修改表
- Excel的vlookup函数的用法
- JSON学习笔记(二)- 对象
- node --- 使用node连接mysql
- Visual Entity 手册(十一)代码生成设置
- numpy中数组的简单运算以及使用
- 【Es】Es 选主流程
- php 去掉后导字符,PHP去除字符串最后一个字符的三种方法实例
- 多线程中redistemplate不执行_在 Flink 算子中使用多线程如何保证不丢数据?
- Win10右键新建中没有新建文件夹,电脑右键新建文件夹不见了
- FM信号测试软件,音频测试方案:音频FM指标测试方法
- 免费SSL证书的制作
- 修复40G的老IDE硬盘
- cholesky分解java代码,实数矩阵Cholesky分解算法的C++实现
- [游戏杂谈]浅谈游戏打击感