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

    你可能感兴趣的文章
    opencv——图像缩放1(resize)
    查看>>
    opencv——最简单的视频读取
    查看>>
    Opencv——模块介绍
    查看>>
    OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?
    查看>>
    OpenCV与AI深度学习 | CIB-SE-YOLOv8: 优化的YOLOv8, 用于施工现场的安全设备实时检测 !
    查看>>
    OpenCV与AI深度学习 | CoTracker3:用于卓越点跟踪的最新 AI 模型
    查看>>
    OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法
    查看>>
    OpenCV与AI深度学习 | OpenCV图像拼接--Stitching detailed使用与参数介绍
    查看>>
    OpenCV与AI深度学习 | OpenCV如何读取仪表中的指针刻度
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(一) :直接拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(二) :基于模板匹配拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | T-Rex Label !超震撼 AI 自动标注工具,开箱即用、检测一切
    查看>>
    OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
    查看>>
    OpenCV与AI深度学习 | YOLOv10在PyTorch和OpenVINO中推理对比
    查看>>
    OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性
    查看>>
    OpenCV与AI深度学习 | YOLOv8自定义数据集训练实现火焰和烟雾检测(代码+数据集!)
    查看>>
    OpenCV与AI深度学习 | YOLOv8重磅升级,新增旋转目标检测,又该学习了!
    查看>>
    OpenCV与AI深度学习 | 一文带你读懂YOLOv1~YOLOv11(建议收藏!)
    查看>>