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位于整个编码流的起始位置,字段说明如下:

  1. profile_idc :占用一个字节,标志当前h264码流的profile

66 baseline profile

77 main profile

88 extended profile

  1. level_idc 标志当前码流的level,编码level定义了某种条件下最大视频分辨率,最大视频帧率等参数
  2. Seq_parametrer_set_idc 当前序列参数id
  3. Log2_max_frame_num_minus4 用于计算maxframenum值
  4. Pic_order_cnt_type 表示解码picture order count的方法
  5. Log2_max_pic_order_cnt_lsb_minus4 用于计算MaxpicOrderCntLsb的值,用于表示poc上限。
  6. Max_num_ref_frames 表示参考帧的最大数目
  7. Gaps_in_frame_num_value_allowed_flag 说明frame_num是否允许不连续的值
  8. Pic_width_in_mbs_minus1 用于计算图像宽度
  9. Pic_height_in_map_units_minus1 用以度量视频中一帧图像的高度
  10. Frame_mbs_only_flag 说明宏块的编码方式,0 宏块可能为帧编码或者场编码,为1宏块都采用帧编码
  11. Mb_adaptive_frame_field_flag 标志位,说明是否采用宏块级的帧场自适应编码。
  12. Direct_8x8_inference_flag 标记位,用于B_Skip,B_Direct模式运动适量
  13. Frame_cropping_flag 标记位 是否对输出的图像进行裁剪
  14. 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 格式分析相关推荐

  1. 音视频 HLS协议和m3u8格式分析

    什么是HLS HLS协议草案历史:https://datatracker.ietf.org/doc/rfc8216/ 可直接看:https://www.rfc-editor.org/rfc/rfc82 ...

  2. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )

    文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...

  3. 【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | 文件头 Header 分析 | 标签 Tag 分析 | 视频标签 Tag 数据分析 )

    文章目录 安卓直播推流专栏博客总结 一. RTMP 格式解析 二. 文件头 Header 分析 三. 标签 Tag 分析 四. 视频标签 Tag 数据分析 安卓直播推流专栏博客总结 Android R ...

  4. storm的消息格式分析

    storm的消息格式分析 @(STORM)[storm] storm的消息格式分析 一ITuple接口 二core-storm的消息格式 三trident的消息格式 一trident中tuple的基本 ...

  5. AAC ADTS格式分析

    AAC ADTS格式分析: 没有详细的参数说明,只有格式分析.可以查询文档查看详细参数说明. ADTS的全称是Audio Data Transport Stream.是AAC音频的传输流格 式.AAC ...

  6. 音视频开发(31)---H.264格式分析

    H.264格式分析 一.H.264基本流结构 H.264 的基本流(elementary stream,ES)的结构分为两层,包括视频编码层(VCL)和网络适配层(NAL).视频编码层负责高效的视频内 ...

  7. AVI视频格式分析-封装格式

    AVI视频封装格式分析 使用的工具 RIFF块 CHUNK块 LIST块 hdrl LIST avih CHUNK strl LIST strh CHUNK strf CHUNK JUNK CHUNK ...

  8. AAC音频格式分析与解码

    原文地址为: AAC音频格式分析与解码 一直在做一个语音项目,到了测试阶段,近来不是很忙,想把之前做的内容整理一下. 关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia. ...

  9. 双星物语MV2动画格式分析

    格式分析 在<双星物语>中除了使用MMV动画外,还使用了MV2动画,这是一种高彩动画. MV2文件的格式如下: 4字节 动画的帧数 44字节 解码用的文件BITMAPINFO信息 4字节 ...

  10. jpg分辨率格式 jpg格式分析(转)

    JPEG格式 格式:JFIF(JPEG档的交换格式) 压缩:JPEG(灰阶影像压缩比约为10:1:彩色影像约为20:1) 以JPEG文件格式保存的图像实际上是2个不同格式的混合物:JPEG格式规范本身 ...

最新文章

  1. 先进一站式IP及定制
  2. 【翻译】将Ext JS Grid转换为Excel表格
  3. 【PHP】最详细PHP从入门到精通(二)——PHP中的函数
  4. git解决pre-commit hook failed的问题
  5. 第一百零三期:解读回归测试:类型、选择、挑战和实践
  6. css图片自适应 有缝隙,有间隙,解决办法
  7. 如何用C#写一个简单的Login窗口
  8. Android aidl Binder框架浅析
  9. 电脑一直显示服务器不兼容,原神PC版提示版本不兼容怎么办 PC版常见问题介绍...
  10. “唵嘛呢叭咪吽”是什么意思? - 搜搜问问
  11. Arcgis专题制图流程
  12. java实现屏幕亮度调节
  13. 计算机应用中英文缩写ai表示,2014年全国计算机等级一级考试题库
  14. defcon-ctf qualifer crypto writeup
  15. APPLE G5 机箱改造“黑苹果”全攻略
  16. mysql下载32位安装教程_MySQL下载安装教程
  17. 用SRS搭建流媒体系统
  18. mac php开发套件_Mac 下搭建 PHP 开发环境的步骤
  19. 【毕业设计】病房无线呼叫系统 - stm32 单片机 物联网 嵌入式
  20. Word文档在前台页面展示

热门文章

  1. 在 Chrome 浏览器中安装印象笔记·剪藏插件
  2. Java获取名字首字母拼音及用户按名字拼音分组工具
  3. MacOS 下 Safari、Chrome 等浏览器 无法打开知到(智慧树)等网页解决方案
  4. 第一次开卡SSD硬盘成功,主控为SM2258XT(附软件)
  5. 利用可道云kodexplorer一键部署私有云!路由器免费变NAS!
  6. javaweb后台管理系统
  7. php留言板制作模板,简单5步,制作wordpress留言板
  8. 如何使用雅虎相册在陶宝网增加宝贝描述图片(转)
  9. 报表开发工具FastReport开源代码2020首发更新!邀您免费下载
  10. AirPlay、AirTunes 移植开发