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

    你可能感兴趣的文章
    python基于flask搭建http服务(四)—— Docker容器化部署
    查看>>
    Python块键盘/鼠标输入
    查看>>
    python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
    查看>>
    python在gpu上运行_【python】python开启GPU加速
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
    查看>>