远程遥控车-实时视频方案之MediaCodec.H264硬编码、解码

其实我从一开始就比较倾向于硬编透传的,利用GPU编码不香吗。在网上找了大量资料之后,github上找到了一个不错的开源例子,具体地址忘了,sorry!这里面,我看到了、学到了我想要的,甚至现在完美的跑了起来。
网上的一系列MediaCodec配置就不说了,主要说说对比之前我的认知,发现的一些东西。首先是视频分帧,在编码器outputBuffer出数据后,找到sps(0x00 00 00 01 67) 对应十进制就是 0 0 0 1 103,找到IDR帧(0x0000000165) 对应十进制就是 0 0 0 1 101,然后再关IDR帧前面加上sps信息,发送给socket。
解码端,一开始是有问题的,后面想通了才发现挺好理解的。最开始我是直接读取到socket数据:

byte[] bytes = new byte[4096];
int le = input.read(bytes);
byte[] out = new byte[le];
System.arraycopy(bytes, 0, out, 0, out.length);

然后放进解码器进行解码,发现还是不行,后来我仔细看那个例子,发现它在发送包之前,加入了一个自定义的头部,就是这个头部,每一次读取到一个完整的帧数据,才能丢进去解码,因为我们读取数据设置的缓冲是4096,一帧数据不止4096的话,那么每次就读取不完,需要等下一次循环,把上一次的一起copy进来,再寻找自定义头部,以头部做分割,下一帧之前的数据,全部放到解码器,然后本次剩余的数据,等待下一次循环,再放到前面去,又这样凑齐下一帧。解码是按帧解的,最后渲染到SurfaceView
ps:后面阅读了一下H264帧相关文章,其实人家每一帧开头都是00 00 00 01 ,所以可以按这个将数据包拆帧(人笨了,没办法。)
再一个就是,渲染最好是TextureView,因为这玩意儿操作性更高,可以移动,旋转等等
现在面临的下一个问题就是延迟,还在排查,目前延迟2s左右,排除手机性能问题。