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

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

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

1、flv格式

  介绍flv格式的博客有很多,个人觉得5.2及5.3结合起来看比较好,其中5.2的script tag应该得值是12才是对的。摘录些重要的。

在这里插入图片描述
  flv的tag类型有三种,video(9), audio(8), script_data(12)。
  tag的组成如下:
在这里插入图片描述
  如果视频格式是AVC(h264)的话,VideoTagHeader会多出4个字节的信息分别是一字节的AVCPacketType 和3字节的CompositionTime。
来自参考5.3的video tag及audio tag的图。
在这里插入图片描述
在这里插入图片描述

2、注意

  h264的sps及pps数据在发送视频帧之前会首先单独发送过来,需要做保存,因为有些rtmp serevr不会在每一个I帧前添加这些信息。

  收到的AAC音频需要根据解析到AAC格式信息添加adts头部,代表AAC音频采样率的2bit其值总是3

3、添加ADTS头部

/* *注意,这里的packetLen参数为raw aac Packet Len + 7; 7 bytes adts header */static void addADTStoPacket(char* packet, int packetLen, int frequence) {      int profile = 2;  //AAC LC,MediaCodecInfo.CodecProfileLevel.AACObjectLC;      int freqIdx = -1;  //48K, 见后面注释avpriv_mpeg4audio_sample_rates中32000对应的数组下标,来自ffmpeg源码      int chanCfg = 2;  //见后面注释channel_configuration,Stero双声道立体声     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 ;     }      /*int avpriv_mpeg4audio_sample_rates[] = {          96000, 88200, 64000, 48000, 44100, 32000,                  24000, 22050, 16000, 12000, 11025, 8000, 7350      };      channel_configuration: 表示声道数chanCfg      0: Defined in AOT Specifc Config      1: 1 channel: front-center      2: 2 channels: front-left, front-right      3: 3 channels: front-center, front-left, front-right      4: 4 channels: front-center, front-left, front-right, back-center      5: 5 channels: front-center, front-left, front-right, back-left, back-right      6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel      7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel      8-15: Reserved      */      // fill in ADTS data      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&7)<<5) + 0x1F);      packet[6] = 0xFC;}

4、

  centos6.9上实现的demo,能同时写下flv,h264及AAC文件(只针对48KHZ ,AAC-LC,16bit采样位数)

5、参考

《1》、

《2》、
《3》、
《4》、
《5》、
《6》、
《7》

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

你可能感兴趣的文章
Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
查看>>
Node-RED中建立TCP服务端和客户端
查看>>
Node-RED中建立Websocket客户端连接
查看>>
Node-RED中建立静态网页和动态网页内容
查看>>
Node-RED中解析高德地图天气api的json数据显示天气仪表盘
查看>>
Node-RED中连接Mysql数据库并实现增删改查的操作
查看>>
Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
查看>>
Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
查看>>
Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
查看>>
Node-RED怎样导出导入流程为json文件
查看>>
Node-RED订阅MQTT主题并调试数据
查看>>
Node-RED通过npm安装的方式对应卸载
查看>>
node-request模块
查看>>
node-static 任意文件读取漏洞复现(CVE-2023-26111)
查看>>
Node.js 8 中的 util.promisify的详解
查看>>
node.js debug在webstrom工具
查看>>
Node.js GET、POST 请求是怎样的?
查看>>
Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
查看>>
Node.js RESTful API如何使用?
查看>>
node.js url模块
查看>>