rtmp发送H264及aac的音视频 (转)
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后面接需要发送的数据
最新文章
- MySql常用数据类型分析
- 删除mysql中root用户恢复方法
- Android中Listview展示及其优化好处
- scrollTop和offsetTop的区别,scrollTopLeft和offsetLeft的区别
- 【BZOJ1051】1051: [HAOI2006]受欢迎的牛 tarjan求强连通分量+缩点
- Apache + PHP 环境搭建
- JSP页面中<;%! %>;和<;% %>;的区别
- dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程
- Android模拟器常用命令收录
- C/C++基础知识总结——数组、指针域、字符串
- 关于MYSQL存储中文问题
- declare 命令
- NOIP 2011 观光公交
- Spring Boot 添加jersey-mvc-freemarker依赖后内置tomcat启动不了解决方案
- 【转载】VS写汇编程序01:VS2015配置汇编语言开发环境
- mvc RedirectToAction、mobile 重定向地址栏未改变
- js问题: is not a function
- Python 实例方法、类方法、静态方法的区别与作用
- [ZJOI2006]书架
- 桥接和nat连接
热门文章
- 原创:项目管理的理论与实践 讲座的PPT
- Android系统代码查询命令集合
- js实现把中文、英文标点转换
- Photon Cloud Networking: OnPhotonSerializeView Not Firing
- Java 对称加密
- header(";Location:http://www.baidu.com";);
- [转载] ffmpeg函数介绍
- fedora 安装新字体 courier new xxx
- SQL—数据分析
- 剑指offer-第四章解决面试题的思路(二叉树的镜像)