博客
关于我
基于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/

    你可能感兴趣的文章
    npm配置安装最新淘宝镜像,旧镜像会errror
    查看>>
    NPM酷库052:sax,按流解析XML
    查看>>
    npm错误 gyp错误 vs版本不对 msvs_version不兼容
    查看>>
    npm错误Error: Cannot find module ‘postcss-loader‘
    查看>>
    npm,yarn,cnpm 的区别
    查看>>
    NPOI
    查看>>
    NPOI之Excel——合并单元格、设置样式、输入公式
    查看>>
    NPOI初级教程
    查看>>
    NPOI利用多任务模式分批写入多个Excel
    查看>>
    NPOI在Excel中插入图片
    查看>>
    NPOI将某个程序段耗时插入Excel
    查看>>
    NPOI格式设置
    查看>>
    NPOI设置单元格格式
    查看>>
    Npp删除选中行的Macro录制方式
    查看>>
    NR,NF,FNR
    查看>>
    nrf24l01+arduino
    查看>>
    nrf开发笔记一开发软件
    查看>>
    nrm —— 快速切换 NPM 源 (附带测速功能)
    查看>>
    nrm报错 [ERR_INVALID_ARG_TYPE]
    查看>>
    NS3 IP首部校验和
    查看>>