您当前的位置: 首页 >  音视频

命运之手

暂无认证

  • 1浏览

    0关注

    747博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android音视频开发】【029】RTMP和FLV数据包格式图解

命运之手 发布时间:2021-08-18 22:38:24 ,浏览量:1

前篇

这篇博客内容特别长,但总结得非常系统,可以学到很多东西,让大家少走很多弯路

刚学音视频的,千万不要排斥逐个字节去分析文件结构,这个是音视频的基础

没有这些基本功,最多只能在网上抄抄Demo,任何小细节自己都处理不了

RTMP和FLV的关系

FLV是一种文件格式,RTMP是一种流媒体格式

FLV出现在先,RTMP完全照搬了FLV对音视频文件的封装方式,但是对Header部分做了自己的修改

所以如果想做RTMP和FLV之间的互转,最重要的知识就是按字节读出头中的每个参数,再写成另一个头格式

FLV是由一个FLV Header + 若干FLV Tag构成的,而RTMP则是由若干RTMP Packet构成的

FLV Tag和RTMP Packet,除了Header部分,Body部分格式是完全一样的

在这里插入图片描述 在这里插入图片描述 FLV文件结构

本篇博客中图片较多,如果嫌图片太小,可右键拖拽到新窗口单独查看 在这里插入图片描述 FLV中的首个TAG,必然是脚本数据,Script Tag一般用于指明媒体文件的参数信息

RTMP流结构

在这里插入图片描述 FLV TAG块结构

在这里插入图片描述 RTMP Packet包结构

在这里插入图片描述 RTMP Header有多种格式

Header Type为0时,Header具有完整的12个字节,为1时,共8个字节,首个音频帧或视频帧,都要采用这种格式

Header Type为1时,Header只有8个字节,没有Stream ID,使用和前个包一样的Stream ID

Header Type为2时,Header只有4个字节,没有Body Size和Packet Type,对于某些音频格式来说,每个包的格式和大小都是一样的,可以使用和前个包一样的值

Header Type为3时,Header只有1个字节,没有Timestamp,当一个Packet放不下数据,分割为多个Packet时,就会使用这种格式

Script Body结构

在这里插入图片描述在这里插入图片描述 AMF全称Action Message Format,是FLV TAG中用来存储消息内容的一种格式单元

AMF Array中的Attribute又称为Metadata,每个属性代表了一个媒体参数,从格式可以看出,Attribute实际上就是一个子的AMF

媒体文件的duration,width,height,framerate,bitrate等参数,就存储在Attribute里面

AMF2的类型,既可以是AMFArray,也可以AMFObject,Array用的更多,有些解析工具不支持AMFObject

Audio Body结构

在这里插入图片描述

Video Body结构

在这里插入图片描述

RTMP和FLV格式图解+分析工具+测试文件下载

RTMP和FLV格式图解+分析工具+测试文件.zip

通过librtmp将RTMP流转换为FLV文件,H264文件,AAC文件

以上只是理论部分,通过这个实际案例,我们可以对RTMP和FLV格式有一个完整的了解

只有百分百掌握了文件格式,才可能准确无误地实现格式转换

字节处理是音视频开发的基础,希望初学者要有耐心,如果现成的Demo都学不透,更不可能成为一个专业的音视频工程师

篇幅较长,所以单独开一篇博客,请参阅

【NDK】【034】RTMP写入FLV,H264,AAC文件

后话

网上有很多一上来就直接解析文件的教程,但是在对整体结构不是很清楚的情况下,是很难阅读的

如果完整看完这篇博客,再对照代码去逐行对比阅读,就会发现太简单了,实践和理论一模一样

关注
打赏
1654938663
查看更多评论
立即登录/注册

微信扫码登录

0.0381s