流媒体服务系列文章
文章目录
- 流媒体服务系列文章
- 前言
- 一、FLV 封装格式解析
- 二、实例分析
- 总结
前言
一、FLV 封装格式解析
flv header + flv body
flv header + previous size0 + tag1 + previous size1 + tag2 + …+ prvious sizen+ tagn+1
flv header + previous size0 + tag1 header + tag1 data1 + …+ previous sizen + tagn header+tagn data
previous tag sizen 表示的前一个tag的整体大小
每个Tag数据大小在Tag Header头里面的Data size字段里面;
二、实例分析
FLV HEADER
总结:
1.Flv header 的前三个字节是固定的FLV的 ASCII 码的值0x46 0x4C 0x56;
2.接下来的一个字节表示 FLV 的版本号,例如 0x01 代表 FLV 版本号为 1;
3.第 5 个字节中的第0位和第2位分别表示video和audio的存在情况(1表示存在,0 表示不存在)其余6位必须为0.最后的4字节,表示FLV Header的长度,对于version 1,此处为9;
4.一般判断格式是不是flv,先从收到数据的第一字节连续查找flv三个字符,如果找到一般可以判断是flv封装格式;
5.Header头数据一般是9字节但是不绝对,所以需要读最后的长度字段来解析;
FLV TAG Header
1.无论那种类型的tag,tag头字节都是11字节,要解析里面的音频帧,视频帧或者元数据需要读取tag头里面的data长度字段;
2.时间戳很关键,播放过程中,FLV tag的时间信息完全依赖于 FLV 时间戳,内置的其他时间信息都被忽略掉,一般非音视频的tag,时间戳就是0即可;
3.注意计算好时间戳大小,这里的单位是毫秒,所以一定要根据采样率和视频帧率,音频帧采样多少计算好时间戳,然后还要换算成毫秒;
4.Tag头解析完后,Tag数据部分不是视频帧和音频帧,还要根据H264和AAC的打包方案解析才能得到真实的音视频裸数据;
Script TAG 脚本元数据TAG
Video TAG 视频TAG
Audio TAG 音频TAG
总结
1.FLV就三种TAG,比较简单的封装格式,每个TAG都是由Tag Header和TAG Data组成;
2.FLV中对时间戳的处理?如果含有B帧时间戳怎么计算?特别是PTS和DTS时间戳;
3.你能从FLV这种封装格式中,借鉴到什么?加入让你设计一种私有封装格式,又该如何设计;
4.如果FLV里面扩展H.265视频编码格式,你觉得大概的思路是什么;
5.你觉得FLV的缺点有哪些;