RTMP推送的音视频流的封装形式和FLV格式相似,由此可知,向FMS推送H264和AAC直播流,需要首先发送"AVC sequence header"和"AAC sequence header",这两项数据包含的是重要的编码信息,没有它们,解码器将无法解码。

  AVC sequence header就是AVCDecoderConfigurationRecord结构,该结构在标准文档“ISO-14496-15 AVC file format”中有详细说明。

  AAC sequence header存放的是AudioSpecificConfig结构,该结构则在“ISO-14496-3 Audio”中描述。AudioSpecificConfig结构的描述非常复杂,这里我做一下简化,事先设定要将要编码的音频格式,其中,选择"AAC-LC"为音频编码,音频采样率为44100,于是AudioSpecificConfig简化为下表:

  这样,AVC sequence header和AAC sequence header的内容可以基本确定了,更详细的信息,大家可以去翻阅相关文档。

在发送这两个header需要在前面分别加上 VideoTags、AudioTags  这连个tags都是1个字节(8bits)的数据

其中AudioTags每bit表示的意义如下图:

其中SoundData 的组成如下:

当数据的第一个字节为0时,后面跟AAC sequence header;

当数据的第一个字节为1时,后面跟AAC 数据;

其中VideoTags每bit表示的意义如下图:

发送的为avc数据,所以,CodecID(后4bit)的值为7

所以videodata的数据打包方式为 ,具体的信息见下图:

具体代码实现:

//添加Flv的VideoTags char* RtmpLiveEncoder::AddVideoTags(char* buf,bool isKeyframe) { //前面4字节表示FrameType,后面4字节表示CodecID unsigned char flag = 0; if (isKeyframe) flag = 0x17; else flag = 0x27;
buf = UI08ToBytes(buf, flag); buf = UI08ToBytes(buf, 1);    // avc packet type (0, nalu)  包的类型,同步包为0 buf = UI24ToBytes(buf, 0);    // composition time  0为打开,1为关闭
return buf; } //添加Flv的AudioTags char* RtmpLiveEncoder::AddAudioTags(char* buf) { // unsigned char flag = 0; flag = (10 << 4) |  // soundformat "10 == AAC" (3 << 2) |      // soundrate   "3  == 44-kHZ" (1 << 1) |      // soundsize   "1  == 16bit" 1;              // soundtype   "1  == Stereo"
buf = UI08ToBytes(buf, flag);  buf = UI08ToBytes(buf, 1);    // aac packet type (1, raw)  包的类型,同步包为0
return buf; }

这两个函数返回的buf后面接需要发送的数据

rtmp发送H264及aac的音视频 (转)的更多相关文章

  1. rtmp发送H264及aac的音视频

    RTMP推送的音视频流的封装形式和FLV格式相似,由此可知,向FMS推送H264和AAC直播流,需要首先发送"AVC sequence header"和"AAC sequ ...

  2. 各种RTMP直播流播放权限_音视频_数据花屏_问题检测与分析工具EasyRTMPClient

    之前的一篇博客<网络摄像机IPCamera RTSP直播播放网络/权限/音视频数据/花屏问题检测与分析助手EasyRTSPClient>,我们介绍了RTSP流的检测和分析工具EasyRTS ...

  3. 使用librtmp进行H264与AAC直播

    libx264 版本是 128libfaac 版本是 1.28 1.帧的划分 1.1 H.264 帧 对于 H.264 而言每帧的界定符为 00 00 00 01 或者 00 00 01. 比如下面的 ...

  4. 网络摄像机IPCamera RTSP直播播放网络/权限/音视频数据/花屏问题检测与分析助手EasyRTSPClient

    前言 最近在项目中遇到一个奇怪的问题,同样的SDK调用,访问海康摄像机的RTSP流,发保活OPTIONS命令保活,一个正常,而另一个一发就会被IPC断开,先看现场截图: 图1:发OPTIONS,摄像机 ...

  5. C++实现RTMP协议发送H.264编码及AAC编码的音视频

    http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP ...

  6. C++实现RTMP协议发送H.264编码及AAC编码的音视频(转)

    C++实现RTMP协议发送H.264编码及AAC编码的音视频(转) RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia ...

  7. 【转】C++实现RTMP协议发送H.264编码及AAC编码的音视频

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...

  8. RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...

  9. (转)C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播

    转:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RT ...

随机推荐

  1. IIC时序图

  2. MySQL index merge

    深入理解 index merge 是使用索引进行优化的重要基础之一. [ index merge]       当where谓词中存在多个条件(或者join)涉及到多个字段,它们之间进行 AND 或者 ...

  3. git clone 时显示Filename too long的解决办法

    在git bash中,运行下列命令: git config --global core.longpaths true 就可以解决该问题. --global是该参数的使用范围,如果只想对本版本库设置该参 ...

  4. 记录下一次错误报http请求500,

    1.请求控制层没问题,能请求到,如果缺少参数都会返回提示信息,但是请求参数都对了以后,居然报500,非常不解 找了好久,不知道哪里错了,最后经理提示是不是有可能,mapper.xml出错了,最后,我将 ...

  5. ng 自定义服务

    服务的本质是对象. 创建服务的常见方式:factory(返回对象) service (方法.属性)constant(常量服务) value(变量服务) 1.factoryapp.factory('服务 ...

  6. Ubuntu 中 java 环境 (sunjdk) 的配置 (附详细说明)

    暑假以来为了鼓捣双系统废了很大的劲儿,本来一股脑想装 CentOS,无奈怎么处理分区引导都不能成功地与 Win8 共存,最终用 Ubuntu 一句 "检测到系统上有 Windows Boot ...

  7. 5款实用的硬盘、SSD固态硬盘、U盘、储存卡磁盘性能测试工具绿色版

    http://www.iplaysoft.com/disk-benchmark-tools.html/comment-page-1#comment-149425

  8. 数据库SQL、SQLite语句单引号、双引号的用法

    最近编程操作数据库语句的时候出现一些问题. 关于Insert字符串 ,在(单引号,双引号)这个方面发生了问题,其实主要是因为数据类型和变量在作怪. 下面我们就分别讲述,虽然说的是Insert语句, 但 ...

  9. 因实现本地浏览器访问nginx修改配置文件后,安装vsftpd失败

    解决方法如下(修改dns配置) vi /etc/resolv.conf 在此文件最后加入:nameserver 8.8.8.8 如果没有vi编辑器可用: echo "nameserver 8 ...

  10. TortoiseGit不同分支合并代码

    现在有主分支master和分支day2.现在要把day2上的变更合并到主分支master上! 1.首先切换到目标分支master上. 说明当前分支是master分支. 2.在master分支上查看提交 ...