视频编解码,编的是什么码?解的又是什么码?有没有想过?现在主流的就是H264码流,Android 采集摄像头原始帧数据
这篇博客讲解的是如何从摄像头从提取YUV画面色值,然后由MediaCodec进行编码压缩,最后生成的就是H264码流,我们先了解下H264码流格式。
可以看到一个个NALU单元组成了H264码流,NALU单元又包含头数据部分和帧数据部分。
每一个头开始都包含0x 00000001或者0x000001.
我选取了上面讲的采集摄像头画面进行编码后的H264文件,打开其字节文件,码流格式数据如下
可以看到手机编码后的码流每个NAL开头起始码为0x00000001
所以我要做的工作就是提取出每一个NAL单元,然后送给MediaCodec进行解码。
提取出NAL 单元的代码函数如下
private byte[] getNALU() {
try {
int curpos = 0;
//一般NAL不超过100000字节
byte[] bb = new byte[100000];
//先读取4个字节
rf.read(bb, 0, 4);
//判断是否是0x00000001开头
if (findStartCode4(bb, 0)) {
curpos = 4;
} else {
rf.seek(0);
rf.read(bb, 0, 3);
//判断是否是0x000001开头
if (findStartC