【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | 文件头 Header 分析 | 标签 Tag 分析 | 视频标签 Tag 数据分析 )
文章目录
一、 RTMP 格式解析
RTMP 视频数据包格式与 flv 视频格式类似 , 使用二进制分析工具分析 flv 视频文件 , 相关工具都在博客资源中 ;
分析 flv 文件格式 :
① flv 视频文件构成 : flv 视频由一个文件头 Header 与若干标签 Tag 组成 ;
② 使用二进制查看器 , 打开 flv 视频文件 , 如下图所示 :
③ 使用 flvAnalyser 工具打开 flv 视频文件 :
二、 文件头 Header 分析
文件头 Header 分析 :
① flv 视频文件文件头 : 46 4C 56 ( 16 进制格式 ) , 这是 FLV 字母的 ASCII 码 ; 只要是 flv 格式的文件 , 前三个字节必定是这三个值 ;
② 文件版本 : 第
个字节时 FLV 格式的版本 , 这里是 01 ; ( 参考上图 )
三、 标签 Tag 分析
flv 标签数据结构 :
① 标签类型 ( tag type ) :
字节 , 索引区间
, 0x08 代表音频 , 0x09 代表视频 , 0x12 代表脚本信息 ;
② 标签数据大小 ( data size ) :
字节 , 索引区间
, 除了包头之外的数据大小 , 包头一般是
字节, 整个标签大小是该 标签数据大小 ( data size ) + 11 ;
③ 时间戳 ( time stamp ) :
字节 , 索引区间
, 表示从开始播放到当前时刻的播放时间 , 单位毫秒 , 也就是当前标签的时间与第一个标签时间的差值 ;
④ 时间戳扩展位 ( time stamp ext ) :
字节 , 索引区间
, 如果时间戳较大 ,
位装不下 , 扩展一位 ;
⑤ 流编号 ( stream id ) :
字节 , 索引区间
, 一般都是 0 ;
上述
字节时包头信息 , 下面就是实际的数据信息 , 有 标签数据大小 ( data size ) 个字节的数据 ;
⑥ 数据区 ( data ) : 标签数据大小 字节 , 索引区间
, 标签数据大小 ( data size ) 个字节的数据 ;
视频标签 与 音频标签 : 在 flvAnalyser 中可以清晰的看到文件头 Header 与 标签 Tag 的结构 , 其中 红色的框表示 视频数据标签 , 绿色的框表示 音频数据标签 ;
四、 视频标签 Tag 数据分析
1 . 打开视频标签数据 : 在 flvAnalyser 工具中 , 双击 1 号标签 , 该标签是 h264 视频标签 , 弹出如下对话框 , 开始分析该视频标签中的数据 ;
2 . 视频标签数据详情 :
0x00000182 : 09 00 00 2E 00 00 00 00
0x0000018a : 00 00 00 17 00 00 00 00
0x00000192 : 01 64 00 32 FF E1 00 19
0x0000019a : 67 64 00 32 AC D9 80 78
0x000001a2 : 02 27 E5 84 00 00 03 00
0x000001aa : 04 00 00 1F 40 3C 60 C6
0x000001b2 : 68 01 00 05 68 E9 7B 2C
0x000001ba : 8B 00 00 00 39
3 . flv 视频标签数据分析 : 以下所有的数据都是十六进制数据 , 这里省略 0x 前缀 ;
① 标签类型 ( tag type ) :
字节 , 索引区间
, 此处是 09 表示音频数据
② 标签数据大小 ( data size ) :
字节 , 索引区间
, 00 00 2E , 46 字节 , 视频数据有 46 字节 , 该标签的总数据是 46 + 11 = 57 字节 ;
③ 时间戳 ( time stamp ) :
字节 , 索引区间
, 00 00 00 , 当前时间戳是 0 , 这是第 1 个标签 , 与其本身差值自然是 0 ;
④ 时间戳扩展位 ( time stamp ext ) :
字节 , 索引区间
, 00 , 该位也是 0 ;
⑤ 流编号 ( stream id ) :
字节 , 索引区间
, 00 00 00 , 这个值一般都是 0 ;
上述
字节时包头信息 , 下面就是实际的数据信息 , 有 标签数据大小 ( data size ) 个字节的数据 ;
⑥ 数据区 ( data ) : 标签数据大小 字节 , 索引区间
, 后面有 46 字节的视频数据 ;
下面开始分析这 46 字节的视频数据 ;
相关文章
- Android | Jetpack 处理回退事件的新姿势 —— OnBackPressedDispatcher
- android 浏览器 开发,Android 浏览器的开发实例分享
- android activity自动跳转,Android activity跳转之finish()方法的作用
- android布局文件详解
- Android ListView那些事
- robotium android,Robotium 测试Android apk安装包
- 【Android】KOReader墨水屏用阅读器
- Android Toast的几种使用方式「建议收藏」
- Android 四大组件之一:BroadCastReceiver动态注册广播流程
- Could not find class 'android.support.v4.widget.DrawerLayout$1'
- android studio preview 不显示
- 【Android 热修复】热修复原理 ( 加载 Dex 文件到内存中 | DexClassLoader | PathClassLoader | 反射 Element[] dexElements )
- 【Android 组件化】路由组件 ( 路由组件结构 )
- 【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 )
- 【Android 逆向】Android 系统文件分析 ( 外部存储设备文件 | sbin 命令程序目录 | dev 字符设备目录 )
- 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )
- 【Android 逆向】Android 逆向通用工具开发 ( Android 端远程命令工具 | Android 端可执行程序的 main 函数操作 | TCP 协议服务器建立 | 接收客户端数据 )
- 【错误记录】编译 Android 版本的 ijkplayer 报错 ( ./init-android.sh: 第 37 行: cd: android/contrib/: 没有那个文件或目录 )
- 【ijkplayer】编译 Android 版本的 ijkplayer ② ( 切换到 k0.8.8 分支 | 执行 init-android.sh 脚本进行初始化操作 )
- 【错误记录】Android Studio 编译报错 ( Error: Duplicate resources | 使用 sourceSets 配置多个 res 资源不能有重复名称的资源 )
- 【Android Gradle 插件】Splits 配置 ④ ( Splits#language{} 脚本块配置 | 根据语言进行分包 | LanguageSplitOptions 配置简介 )
- Android之TextView实现文字过长时省略部分或者滚动显示详解手机开发
- [android] 自定义广播事件详解手机开发
- Android下获取SD卡的状态并写入文件到SD卡详解编程语言
- Android开发之文件操作模式深入理解
- Android文件操作方法
- android通过向viewpage中添加listview来完成滑动效果(类似于qq滑动界面)
- 在android中增加curl的解决方法
- android开发教程之系统资源的使用方法android资源文件
- android读取assets文件示例