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

    你可能感兴趣的文章
    NuttX 构建系统
    查看>>
    NutUI:京东风格的轻量级 Vue 组件库
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NutzWk 5.1.5 发布,Java 微服务分布式开发框架
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    Nuxt Time 使用指南
    查看>>
    NuxtJS 接口转发详解:Nitro 的用法与注意事项
    查看>>
    NVelocity标签使用详解
    查看>>
    NVelocity标签设置缓存的解决方案
    查看>>
    Nvidia Cudatoolkit 与 Conda Cudatoolkit
    查看>>
    NVIDIA GPU 的状态信息输出,由 `nvidia-smi` 命令生成
    查看>>
    NVIDIA-cuda-cudnn下载地址
    查看>>
    nvidia-htop 使用教程
    查看>>
    nvidia-smi 参数详解
    查看>>
    Nvidia驱动失效,采用官方的方法重装更快
    查看>>
    nvm切换node版本
    查看>>
    nvm安装以后,node -v npm 等命令提示不是内部或外部命令 node多版本控制管理 node多版本随意切换
    查看>>
    ny540 奇怪的排序 简单题
    查看>>
    NYOJ 1066 CO-PRIME(数论)
    查看>>
    nyoj------203三国志
    查看>>