zoukankan      html  css  js  c++  java
  • 第32月第9天 nat h264 rtmp发送h264 ffmpegt推rtmp

    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
  • 相关阅读:
    HDU 1863 畅通工程
    基于Platinum库的DMS实现(android)
    编写一个程序,输入月份号,输出该月的中文名和英文名。
    Android系统移植与调试之------->如何修改Android设备的开机第一阶段Logo
    利用面向对象解母牛生小牛问题
    Java String.replace()方法
    Android系统移植与调试之------->如何修改Android设备的开机第二阶段Logo
    Linux网络设备驱动架構學習(三)
    把给定的字符串解析为Date对象
    git使用三把斧
  • 原文地址:https://www.cnblogs.com/javastart/p/10838106.html
Copyright © 2011-2022 走看看