视频编解码传输基础

本文探讨了Android手机摄像头数据为何使用YUV格式,而非RGB,原因是YUV占用更少的存储空间且符合人眼对亮度的敏感度。介绍了从nv21到nv12的转换,以及MediaCodec在编码过程中的作用。重点解析了PTS的概念,指出第一帧的PTS不是0,因为解码器初始化需要时间,PTS是一个递增的时间轴,确保视频流的正确播放顺序。编码后的第一帧包含sps和pps,随后才是I帧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

视频传输通话流程:
在这里插入图片描述
Android手机摄像头的数据格式是nv21,数据为什么采用yuv而不采用rgb呢?
argb表示像素需要的字节更大。每个像素都需要4字节表示亮度a,4x3字节表示rgb三色值,一共需要4x4=16字节;
YUV方式,同样还是用4个字节表示亮度,剩下一个字节表示u,一个字节表示v,这样就表示出了这个像素,只需要4+1+1=6字节。
因为人眼对亮度是比较敏感的,所以要尽可能的保存更多的亮度的值来精确表达亮度的实际值,人眼对色度不太敏感,所以可以降低色度的存储的数据,不用那么精确的表达色度的实际值,人眼也可以达到差不多相同的感官体验。
在这里插入图片描述

编码:把YUV编码成H264的码流。
编码之前需要把nv21的YUV数据转化成nv12格式。nv12又称为YUV420.
把YUV数据传入ByteBuffer,然后传给MediaCodec进行编码。
然后设置pts,也就是每一帧的播放顺序。那么第一帧的pts是0么?肯定不是。因为pts是一个递增的值,解码的时候解码器初始化需要时间,在这个解码的时间轴上,初始化解码器如果耗时10s,这个时候时间轴已经往前走了10s,pts也跟着走到了10了,这回出现个什么问题,0-10s的帧都是过时的帧了,过时虽然被解码出来了,但是不会被播放出来,永远不会被播放出来。举个例子,快进视频的时候,就类似于这种场景了。快进的那一部分视频帧虽然会被解码出来,但是并不会被播放出来。
所以第一帧的pts不可能是0.

设置pts。

之后就是通过dsp芯片编码了。

编码之后就生成了16进制的码流数据了。

编码出来的第一帧不是原始数据,也就是不是画面数据,就是说16进制的第一个NALU不是视频帧数据,而是sps和pps。之后才是I帧,也就是第一帧视频帧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值