httpflv 格式分析
Httpflv协议分析
Httpflv是一种将rtmp等负载信息携带在http协议之上的码流传递协议,特性是可以更好的穿透防火墙。取流的时候需要向服务端发送一个http请求,请求包格式如下:
GET /live/2778_00_1 HTTP/1.1
Host: 42.48.29.11:1935
Accept: */*
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36
X-Requested-With: ShockwaveFlash/32.0.0.142
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
响应包:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/octet-stream
Server: Microsoft-HTTPAPI/2.0
Date: Thu, 21 Feb 2019 06:52:01 GMT
20
FLV ¯
类似于websocket,httpflv也是利用http协议做了连接,然后丢弃掉http协议直接利用该tcp通道进行码流传输。需要注意的是,httpflv传输码流的部分中间会有 \r\n**\r\n来分割一个tagsize和它的tagheader所以格式解析需要注意。
PS:大部分传输会采用http chunked 方法,将码流分包传输。chunk方式
\r\n[chunksize]\r\n[chunkdata]
Flv格式解析:flv文件格式主要包含flv文件头和flv文件体两部分。如图:
其中flv文件头占9个字节,分四个字段。字段定义说明如下:
typedef struct FLV_HEADER
{
BYTE btSignature[3];//文件标记 总是以”flv”开头 0x46 0x4c 0x56
BYTE btVersion;// flv版本说明
BYTE btFlags;//0x01 video,0x04 audio,0x05 video and audio
BYTE btDataOffset[4];//表示整个header的长度。通常是9
};
文件体说明:
文件体由一系列的tag组成,其中每个tag前面又包含了Previous Tag size字段,占用4个字节,表示前面一个tag的大小。组织如图:
每个tag又分为tag Header和tag data两个部分。Tag header占11个字节,分5个字段
typedef struct TAG_HEADER
{
BYTE btPreviousTagSize[4];//前面一个tag长度
BYTE btTagType;//0x08视频 0x09视频 0x12脚本
BYTE btDataSize[3];//负载数据包长
BYTE btTimeStamp[3];//时间戳
BYTE btReserved;//时间戳扩展
BYTE btStreamID[3];
};
负载数据格式介绍—这里只做h264格式数据分析:
第一个数据包分析:第一个字节是视频参数,前后4位分别表示两个字段,前4位表示帧类型,1表示I帧,2p帧..,后4位表示编码ID,7表示AVC(h264).
第二个字节表示ACVPacketType,00 表示第一个包,01表示之后连续的包,02结束包,后面三个字节表示时间戳。
接下来是sps和pps
Sps和pps的作用说明:
在h264的各类语法元素中,sps中的信息至关重要,如果其中的数据丢失可能会导致解码过程失败,sps全名Sequence paramater set,又称作序列参数集,sps中保留了一组编码视频序列的全局参数,一般sps和pps位于整个编码流的起始位置,字段说明如下:
- profile_idc :占用一个字节,标志当前h264码流的profile
66 baseline profile
77 main profile
88 extended profile
- level_idc 标志当前码流的level,编码level定义了某种条件下最大视频分辨率,最大视频帧率等参数
- Seq_parametrer_set_idc 当前序列参数id
- Log2_max_frame_num_minus4 用于计算maxframenum值
- Pic_order_cnt_type 表示解码picture order count的方法
- Log2_max_pic_order_cnt_lsb_minus4 用于计算MaxpicOrderCntLsb的值,用于表示poc上限。
- Max_num_ref_frames 表示参考帧的最大数目
- Gaps_in_frame_num_value_allowed_flag 说明frame_num是否允许不连续的值
- Pic_width_in_mbs_minus1 用于计算图像宽度
- Pic_height_in_map_units_minus1 用以度量视频中一帧图像的高度
- Frame_mbs_only_flag 说明宏块的编码方式,0 宏块可能为帧编码或者场编码,为1宏块都采用帧编码
- Mb_adaptive_frame_field_flag 标志位,说明是否采用宏块级的帧场自适应编码。
- Direct_8x8_inference_flag 标记位,用于B_Skip,B_Direct模式运动适量
- Frame_cropping_flag 标记位 是否对输出的图像进行裁剪
- Vui_parameters_present_flag 标记位 说明sps中是否存在VUI信息。
Pps是类似于sps的参数集合为图像参数集,保留在另一个Nal Unit中,在封装上pps通常与sps一起,保留在码流头部。
从第二帧开始tag包格式如下:
跳过tag头,数据部分前5个字节是固定包头,分三个字段frametype1字节,avcPackettype1字节,和Composition Time3个字节,然后主要分两个部分,第一部分4个字节,表示NALU len,第二部分是NALU Data。格式如图
至此flv文件格式分析完毕。接下来做h264的格式分析
H264码流一般分两种:字节流格式和rtp包格式,rtp包格式里,NALU并不需要一个StartCode来进行标记,只在NALU开始的地方用,若干字节表示其长度。这里我主要分析字节流
一个原始的h264由StartCode,NaluHeader,NaluPayload三部分组成,
StartCode用于标记一个NALU单元的开始,必须是0x00 0x00 0x00 0x01或者0x00 0x00 0x01开始。NaluHeader占一个字节,分三个字段,forbidden_bit(1bit),nal_reference_bit(2bit),nal_uint_type(5bit),
forbidden_bit 是禁止位,nal_reference_bit表示当前NAL的优先级,值越大其重要程度越大,nal_uint_type说明如图:
对于负载数据部分主要就是原始编码数据的解析。负载部分为RBSP,它主要包含两个部分SODB,RBSP尾部。大部分的RBSP尾部只占一个字节,分两个字段rbsp_stop_one_bit占1位,值为1,其他为rbsp_alignment_zero值为0。另外一种当NALU类型为条带时,增加一个或多个0x0000.所以按照以上,只要去掉尾部rbsp,就可以拿到SODB,然后对照类型做对应的解析
httpflv 格式分析相关推荐
- 音视频 HLS协议和m3u8格式分析
什么是HLS HLS协议草案历史:https://datatracker.ietf.org/doc/rfc8216/ 可直接看:https://www.rfc-editor.org/rfc/rfc82 ...
- 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )
文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...
- 【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | 文件头 Header 分析 | 标签 Tag 分析 | 视频标签 Tag 数据分析 )
文章目录 安卓直播推流专栏博客总结 一. RTMP 格式解析 二. 文件头 Header 分析 三. 标签 Tag 分析 四. 视频标签 Tag 数据分析 安卓直播推流专栏博客总结 Android R ...
- storm的消息格式分析
storm的消息格式分析 @(STORM)[storm] storm的消息格式分析 一ITuple接口 二core-storm的消息格式 三trident的消息格式 一trident中tuple的基本 ...
- AAC ADTS格式分析
AAC ADTS格式分析: 没有详细的参数说明,只有格式分析.可以查询文档查看详细参数说明. ADTS的全称是Audio Data Transport Stream.是AAC音频的传输流格 式.AAC ...
- 音视频开发(31)---H.264格式分析
H.264格式分析 一.H.264基本流结构 H.264 的基本流(elementary stream,ES)的结构分为两层,包括视频编码层(VCL)和网络适配层(NAL).视频编码层负责高效的视频内 ...
- AVI视频格式分析-封装格式
AVI视频封装格式分析 使用的工具 RIFF块 CHUNK块 LIST块 hdrl LIST avih CHUNK strl LIST strh CHUNK strf CHUNK JUNK CHUNK ...
- AAC音频格式分析与解码
原文地址为: AAC音频格式分析与解码 一直在做一个语音项目,到了测试阶段,近来不是很忙,想把之前做的内容整理一下. 关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia. ...
- 双星物语MV2动画格式分析
格式分析 在<双星物语>中除了使用MMV动画外,还使用了MV2动画,这是一种高彩动画. MV2文件的格式如下: 4字节 动画的帧数 44字节 解码用的文件BITMAPINFO信息 4字节 ...
- jpg分辨率格式 jpg格式分析(转)
JPEG格式 格式:JFIF(JPEG档的交换格式) 压缩:JPEG(灰阶影像压缩比约为10:1:彩色影像约为20:1) 以JPEG文件格式保存的图像实际上是2个不同格式的混合物:JPEG格式规范本身 ...
最新文章
- 先进一站式IP及定制
- 【翻译】将Ext JS Grid转换为Excel表格
- 【PHP】最详细PHP从入门到精通(二)——PHP中的函数
- git解决pre-commit hook failed的问题
- 第一百零三期:解读回归测试:类型、选择、挑战和实践
- css图片自适应 有缝隙,有间隙,解决办法
- 如何用C#写一个简单的Login窗口
- Android aidl Binder框架浅析
- 电脑一直显示服务器不兼容,原神PC版提示版本不兼容怎么办 PC版常见问题介绍...
- “唵嘛呢叭咪吽”是什么意思? - 搜搜问问
- Arcgis专题制图流程
- java实现屏幕亮度调节
- 计算机应用中英文缩写ai表示,2014年全国计算机等级一级考试题库
- defcon-ctf qualifer crypto writeup
- APPLE G5 机箱改造“黑苹果”全攻略
- mysql下载32位安装教程_MySQL下载安装教程
- 用SRS搭建流媒体系统
- mac php开发套件_Mac 下搭建 PHP 开发环境的步骤
- 【毕业设计】病房无线呼叫系统 - stm32 单片机 物联网 嵌入式
- Word文档在前台页面展示
热门文章
- 在 Chrome 浏览器中安装印象笔记·剪藏插件
- Java获取名字首字母拼音及用户按名字拼音分组工具
- MacOS 下 Safari、Chrome 等浏览器 无法打开知到(智慧树)等网页解决方案
- 第一次开卡SSD硬盘成功,主控为SM2258XT(附软件)
- 利用可道云kodexplorer一键部署私有云!路由器免费变NAS!
- javaweb后台管理系统
- php留言板制作模板,简单5步,制作wordpress留言板
- 如何使用雅虎相册在陶宝网增加宝贝描述图片(转)
- 报表开发工具FastReport开源代码2020首发更新!邀您免费下载
- AirPlay、AirTunes 移植开发