博客
关于我
基于librtmp客户端记录(H264+AAC)
阅读量:363 次
发布时间:2019-03-04

本文共 1963 字,大约阅读时间需要 6 分钟。

基于librtmp开发RTMP客户端的demo,主要是按照雷神的demo(见5.1)来修改,修改后的demo能将获取到的音视频数据写成h264文件及aac文件。


1. FLV格式概述

FLV(Flash Video)是一种常见的视频格式,广泛应用于网络流媒体播放。关于FLV格式的技术细节,以下是几点重要说明:

  • FLV tag类型:FLV文件中定义的tag类型主要有三种:

    • video(9):表示视频流标签。
    • audio(8):表示音频流标签。
    • script_data(12):表示脚本数据流标签,通常用于控制播放过程。
  • tag组成

    • 每个tag标签的长度由tagSize决定,tagSize可以是1、2、3或4字节。
    • 标签内容包括tag类型、数据长度、标签类型等字段。
  • h264视频格式的特殊说明

    • 当视频格式为h264(AVC)时,VideoTagHeader会额外包含4个字节的信息:
      • 1字节的AVCPacketType,用于标识包的类型。
      • 3字节的CompositionTime,表示视频帧的时间戳。

2. 技术注意事项

在实现h264视频和aac音频的编码过程中,需要注意以下几点:

  • sps及pps数据的处理

    • h264编码使用了sps(Sequence Parameter Set)和pps(Picture Parameter Set)数据,这些数据会在视频帧之前单独发送。
    • 需要将sps/pps数据单独保存,并在视频帧播放前进行注入,尤其是在一些不支持自动注入的RTMP服务器中。
  • aac音频处理

    • 收到的aac音频数据需要根据aac格式信息添加adts(Advanced Audio Codec Transform Stream)头部。
    • adts头部的sample_rate字段由2位采样率信息位表示,值总是3(表示48kHz)。

3. 添加ADTS头部

以下是用于向aac音频包中添加adts头部的代码示例:

static void addADTStoPacket(char* packet, int packetLen, int frequence) {    int profile = 2; // AAC LC    int freqIdx = -1;    int chanCfg = 2; // Stereo双声道    static int avpriv_mpeg4audio_sample_rates[] = {        96000, 88200, 64000, 48000, 44100, 32000,        24000, 22050, 16000, 12000, 11025, 8000, 7350    };    for (int i = 0; i < 13; ++i) {        if (frequence == avpriv_mpeg4audio_sample_rates[i]) {            freqIdx = i;            break;        }    }    if (freqIdx == -1) {        printf("Invaild frequence [%d] \n", frequence);        return;    }    // 填充adts数据    packet[0] = 0xFF;    packet[1] = 0xF1;    packet[2] = (char)(((profile - 1) << 6) + (freqIdx << 2) + (chanCfg >> 2));    packet[3] = (char)(((chanCfg & 3) << 6) + (packetLen >> 11));    packet[4] = (char)((packetLen & 0x7FF) >> 3);    packet[5] = (char)((packetLen & 0x7F) >> 0);    packet[6] = 0xFC;}

4. 项目实现

在centos6.9系统上,修改后的demo可以同时生成flv、h264和aac文件(仅限48kHz、aac-lc、16bit采样)。以下是实现的主要特点:

  • 多格式支持:支持将h264视频和aac音频编码为flv格式。
  • 高兼容性:适用于不同RTMP服务器,尤其是对sps/pps数据处理要求较高的服务器。
  • 高效率:通过优化编码算法,确保视频和音频编码效率达到最大。

5. 参考资料

  • 《1》
  • 《2》
  • 《3》
  • 《4》
  • 《5》
  • 《6》
  • 《7》

  • 以上内容经过优化后,结构清晰,内容详实,适合技术文档或开发者博客使用。

    转载地址:http://htoe.baihongyu.com/

    你可能感兴趣的文章
    Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    Openlayers高级交互(2/20):清除所有图层的有效方法
    查看>>
    Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
    查看>>
    Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
    查看>>
    Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
    查看>>
    Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
    查看>>
    Openlayers高级交互(8/20):选取feature,平移feature
    查看>>
    Openlayers:DMS-DD坐标形式互相转换
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenLDAP(2.4.3x)服务器搭建及配置说明
    查看>>
    OpenLDAP编译安装及配置
    查看>>
    Openmax IL (二)Android多媒体编解码Component
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>