• 推送安霸A7L实时视频至RTMP服务器(1)


    使用librtmp进行H264与AAC直播

    (转:http://www.codeman.net/2014/01/439.html)

    1、帧的划分

    1.1 H.264帧

    对于H.264而言每帧的界定符为00 00 00 01或者00 00 01。

    比如下面的h264文件片断这就包函三帧数据

    00 00 00 01 67 42 C0 28 DA 01 E0 08 9F 96 10 00
    00 03 00 10 00 00 03 01 48 F1 83 2A 00 00 00 01
    68 CE 3C 80 00 00 01 06 05 FF FF 5D DC 45 E9 BD
    E6 D9 48 B7 96 2C D8 20 D9 23 EE EF …

    第一帧是00 00 00 01 67 42 C0 28 DA 01 E0 08 9F 96 10 00 00 03 00 10 00 00 03 01 48 F1 83 2A
    第二帧是00 00 00 01 68 CE 3C 80
    第三帧是00 00 01 06 05 FF FF 5D DC 45 E9 BD E6 D9 48 B7 96 2C D8 20 D9 23 EE EF ..

    帧类型有:
    NAL_SLICE = 1
    NAL_SLICE_DPA = 2
    NAL_SLICE_DPB = 3
    NAL_SLICE_DPC = 4
    NAL_SLICE_IDR = 5
    NAL_SEI = 6
    NAL_SPS = 7
    NAL_PPS = 8
    NAL_AUD = 9
    NAL_FILLER = 12,

    我们发送RTMP数据时只需要知道四种帧类型,其它类型我都把它规类成非关键帧。
    分别是
    NAL_SPS(7), sps帧
    NAL_PPS(8), pps帧
    NAL_SLICE_IDR(5), 关键帧
    NAL_SLICE(1) 非关键帧

    帧类型的方式判断为界面符后首字节的低四位。
    第一帧的帧类型为: 0x67 & 0x1F = 7,这是一个SPS帧
    第二帧的帧类型为: 0x68 & 0x1F = 8,这是一个PPS帧
    第三帧的帧类型为: 0x06 & 0x1F = 6,这是一个SEI帧

    以上是我们利用帧界定符划分帧,并可以判断每一个帧的类型。

    注意:如果是压缩图像成H264帧,我们就可不必进行帧界定,因为每一次压缩的输出都明确了该帧的大小(包括界定符),每一次的压缩的结果可能包函多帧。一会具体讨论。

    1.2 AAC帧

    对于AAC帧它的界定符是FF F1

    这里我就不举例了,可通过查看AAC的二进制文件可以看到如下的帧结构。
    FF F1 50 80 24 9F FD DE 04 00 00 6C 69 62 66 61 61 63 20 31 2E 32 38 00 00 42 15 95 ..

    注意:那么对于AAC而言加上界定符每一帧的前7字节是帧的描述信息,也就是说AAC的祼数据是除去前面的7个字节的,在发送RTMP时,我们要去 掉这7个字节。同样,如果我们是一边压缩一边发送RTMP,我们同样不需要界定帧,因为libfaac每次压缩完成的输出就是一个完整的帧数据,我们只需 要将该帧打包发送即可。

    综合上面的所述,如果我们只是一边压缩一边将压缩结果发送到RTMP服务器,那我们就可以不用对帧进行界定,如果我们是发送H264与AAC文件,那我们就要对帧进行界定。

    2.视频与音频的编码信息

    如果我们只是简答的将压缩数据打包发送给RTMP服务器,那么RTMP服务器是不可以对数据进行解码和播放的,在这之前我们要将音视频的视频的编码信息发送给RTMP服务器。很多人可能苦于寻找下面的三个编码参数而不得要领。其实要想得到也是很简单的。

    2.1 (H264)SPS

    对于H264而言,SPS就是编码后的第一帧。如果是读取H264文件,就是第一个帧界定符与第二帧界定符中间的数据长度是4。

    2.2 (H264)PPS

    对于H264而言,PPS就是编码后的第二帧。如果是读取H264文件,就是第二个帧界定符与第三帧界定符中间的数据,长度不固定。

    2.3 (AAC)AudioDecoderSpecificInfo

    这个长度为2个字节,可以通过计算或者调用函数获取。
    建议通过调用faacEncGetDecoderSpecificInfo(fh,&spec,&len);获取。
    一般情况双声道44100采样下,该值是0x1210

  • 相关阅读:
    kobject.c 添加注释
    DNS之四---实现DNS的转发功能
    DNS之三-----实现DNS的TCP/UDP功能及子域委派
    DNS之二---实现DNS主从复制
    第十二周----chrony时间同步与Cobbler+PXE自动化安装
    网络时间同步服务和chrony
    第十一周----黑客加入黑名单及将普通用户授权root权限
    第十周--IP监控任务脚本实现
    ELK之十三----kibana dashboard(仪表盘)使用
    vmware虚拟机下linux centos6.6只有lo,没有eth0网卡、随机分配ip地址,固定ip地址等问题
  • 原文地址:https://www.cnblogs.com/mokliu/p/4806716.html
Copyright © 2020-2023  润新知