1.视频推流的过程就事,获取到摄像头的数据。
把每一帧图片由NV21转为I420。把YUVI420的每一帧图片分解成RTMPPacket
NV21转为YUVI420怎么转?先来两张图对比数据组成就是。。。就是把原始数据转成这个yuv 4:1:1 的一结构。
然后把YUV420 通过H264编码:
转成 I p b;I帧相似度95% p帧相似度是70%的帧。
先去封装i帧中的。SPS和PPS ,包含了初始化H.264解码器所需要的信息参数,包括编码所用的profile,level,图像的宽和高,deblock滤波器等。
SPS:序列参数集
PPS:图像参数集
然后在包装这个i帧的其他数据和p帧和b帧。
怎么去包装这个个sps 和pps。怎么把一帧图片拆成RTMPPacket?其实还要分两步:
把一帧图片拆成N个NALU单元,上面提到过这个词
把每个NALU单元分装成RTMPPacket。 打包的固定格式。。不管是sps 还是pps 还是非关键帧都是通过打包成packet。
NALU单元:为了方便传输(传输指 文件传输,网络流传输) 我们并不能把一整帧传输过去,一帧的内容太大了,还需要细分才能更方便的传输。如果通过传递一完整帧传过去,对方等的花都谢了。所以我们需要更小的传输单元以保证 更好的压缩性,容错性和实时观看性。这种更小的单元成为NALU单元,所以H264 原始码流(又称为裸流),是有一个接一个的 NALU 组成的,关于NALU的组成(组成可以不去了解,知道传输数据是以NALU为单位就可以了):
NALU=NALU头+RBSP(切片)RBSP=片头+片数据片数据=n*宏块//把一张图片划分成若干个小的区域,这些小的区域称之为宏块//H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。所以:NALU=NALU头+(片头+n宏块)
最后打包封装成一个packet。然后点击开始直播之后。开始从队列中取出packet 发送给服务器。
2.音频推流。
视频数据格式化:摄像头数据(NV21) -> H264 -> RTMPPacket
音频数据格式化:麦克风数据(PCM) -> AAC -> RTMPPacket
1.采集麦克风数据。
2.转码成为faac。
3.封装成packet。上传服务器。
网友评论