1.nat
实例:UDP穿越NAT:
A登录Server,NAT A分配端口11000,Server得到A的地址为100.10.10.10:11000
B登录Server,NAT B分配端口22000,Server得到B的地址为200.20.20.20:22000
此时B会把直接来自A的包丢弃,所以要在NAT B上打一个方向为A的洞,那么A就可以向200.20.20.20:22000发送数据了
打洞的指令来自Server。B向A的地址100.10.10.10:11000发一个UDP报文,被NAT A丢弃,但在NAT B上建立映射记录,NAT B不在丢弃来自A的报文。
Server通知A可以通讯,A发起数据UDP包给B,NAT B放行,B收到A的包,双方开始通讯
注:若是对称NAT,当B向A打洞的端口要重新分配(NAT A不会再分配11000端口),B无法获取这个端口,所以不适用本方法。
实例:TCP穿越NAT:
A登录Server,NAT A分配端口11000,Server得到A的地址为100.10.10.10:11000
B登录Server,NAT B分配端口22000,Server得到B的地址为200.20.20.20:22000
A向B发送TCP数据包SYN:192.168.10.11:1234=>200.20.20.20:22000,在NAT A上打洞
B向A发送TCP数据包SYN:192.168.20.22:1234=>100.10.10.10:11000,在NAT B上打洞
通道建立,A与B三次握手建立TCP连接
https://blog.csdn.net/bairui_Allen/article/details/8492443
2.
1.帧内预测编码
帧内编码用来缩减图像的空间冗余。为了提高H.264帧内编码的效率,在给定帧中充分利用相邻宏块的空间相关性,相邻的宏块通常含有相似的属性。因此,在对一给定宏块编码时,首先可以根据周围的宏块预测(典型的是根据左上角宏块、左边宏块和上面宏块,因为此宏块已经被编码处理),然后对预测值与实际值的差值进行编码,这样,相对于直接对该帧编码而言,可以大大减小码率。
H.264提供9种模式进行4×4像素宏块预测,包括1种直流预测和8种方向预测。在图中,相邻块的A到I共9个像素均已经被编码,可以被用以预测,如果我们选择模式4,那么,a、b、c、d4个像素被预测为与E相等的值,e、f、g、h4个像素被预测为与F相等的值,对于图像中含有很少空间信息的平坦区,H.264也支持16×16的帧内编码。
2.帧间预测编码
帧间预测编码利用连续帧中的时间冗余来进行运动估计和补偿。H.264的运动补偿支持以往的视频编码标准中的大部分关键特性,而且灵活地添加了更多的功能,除了支持P帧、B帧外,H.264还支持一种新的流间传送帧——SP帧,如图3所示。码流中包含SP帧后,能在有类似内容但有不同码率的码流之间快速切换,同时支持随机接入和快速回放模式
3.整数变换
在变换方面,H.264使用了基于4×4像素块的类似于DCT的变换,但使用的是以整数为基础的空间变换,不存在反变换因为取舍而存在误差的问题,变换矩阵如图5所示。与浮点运算相比,整数DCT变换会引起一些额外的误差,但因为DCT变换后的量化也存在量化误差,与之相比,整数DCT变换引起的量化误差影响并不大。此外,整数DCT变换还具有减少运算量和复杂度,有利于向定点DSP移植的优点。
4.量化
H.264中可选52种不同的量化步长,这与H.263中有31个量化步长很相似,但是在H.264中,步长是以12.5%的复合率递进的,而不是一个固定常数。
在H.264中,变换系数的读出方式也有两种:之字形(Zigzag)扫描和双扫描,如图6所示。大多数情况下使用简单的之字形扫描;双扫描仅用于使用较小量化级的块内,有助于提高编码效率。图6 变换系数的读出方式
5.熵编码
视频编码处理的最后一步就是熵编码,在H.264中采用了两种不同的熵编码方法:通用可变长编码(UVLC)和基于文本的自适应二进制算术编码(CABAC)。
在H.263等标准中,根据要编码的数据类型如变换系数、运动矢量等,采用不同的VLC码表。H.264中的UVLC码表提供了一个简单的方法,不管符号表述什么类型的数据,都使用统一变字长编码表。其优点是简单;缺点是单一的码表是从概率统计分布模型得出的,没有考虑编码符号间的相关性,在中高码率时效果不是很好。
因此,H.264中还提供了可选的CABAC方法。算术编码使编码和解码两边都能使用所有句法元素(变换系数、运动矢量)的概率模型。为了提高算术编码的效率,通过内容建模的过程,使基本概率模型能适应随视频帧而改变的统计特性。内容建模提供了编码符号的条件概率估计,利用合适的内容模型,存在于符号间的相关性可以通过选择目前要编码符号邻近的已编码符号的相应概率模型来去除,不同的句法元素通常保持不同的模型。
https://blog.csdn.net/bairui_Allen/article/details/8515984
3.rtmp
/*发送*/
if
(RTMP_IsConnected(rtmp)) {
ret = RTMP_SendPacket(rtmp,packet,TRUE);
/*TRUE为放进发送队列,FALSE是不放进发送队列,直接发送*/
}
https://my.oschina.net/jerikc/blog/501948#OSC_h3_13
H264视频通过RTMP直播
bool h264_decode_sps(BYTE * buf,unsigned int nLen,int &width,int &height)
https://blog.csdn.net/firehood_/article/details/8783589
ffmpeg推rtmp
https://blog.csdn.net/leixiaohua1020/article/details/39803457
ffmpeg编译选项
COMMON_OPTIONS=" --disable-doc --disable-programs --disable-everything --disable-avdevice --disable-postproc --disable-avfilter --disable-symver --disable-avresample --disable-audiotoolbox --disable-videotoolbox --disable-appkit --disable-bzlib --disable-iconv --disable-securetransport --disable-avfoundation --disable-coreimage --disable-sdl2 --disable-zlib --enable-decoder=h264 --enable-decoder=aac --enable-demuxer=mov --enable-demuxer=flv --enable-demuxer=rtsp --enable-demuxer=mp3 --enable-demuxer=h264 --enable-demuxer=aac --enable-muxer=mp4 --enable-muxer=flv --enable-muxer=h264 --enable-muxer=adts --enable-muxer=mp3 --enable-protocol=rtmp --enable-protocol=file --enable-bsf=aac_adtstoasc --enable-bsf=h264_mp4toannexb --enable-bsf=hevc_mp4toannexb " && ./configure --prefix='out' ${COMMON_OPTIONS} && make -j4 && make install && make clean