【Go】FLV文件解析(四)
终于到了完结的时刻,这期我们来解析FLV中的视频Tag。
Video Tag Data
视频Tag的总体结构和音频Tag相似,视频的Tag Data结构如下。
第一个字节的前4比特表示帧类型,共5种。
值 | 类型 | 说明 |
---|---|---|
1 | key frame | 关键帧 |
2 | inter frame | 非关键帧 |
3 | disposable inter frame | 仅H.263 |
4 | generated keyframe | 保留 |
5 | video info/command frame | 命令帧 |
如果帧类型为5,消息流包含一个8位无符号整数,含义如下:
0:Start of client-side seeking video frame sequence
1:End of client-side seeking video frame sequence
后4比特表示视频编码格式,共7种。
值 | 类型 | 说明 |
---|---|---|
1 | JPEG | |
2 | Sorenson H.263 | |
3 | Screen video | |
4 | On2 VP6 | |
5 | On2 VP6 with alpha channel | |
6 | Screen video version 2 | |
7 | AVC |
视频数据根据编码格式而不同,以AVC为例,结构如下。
AVC包类型有3种。
值 | 类型 | 说明 |
---|---|---|
0 | AVC sequence header | sps,pps |
1 | AVC NALU | |
2 | AVC end of sequence | 视频数据部分为空 |
当AVC包类型等于0或2时,CompositionTime为0。AVC包类型为0时,负载部分是一个叫AVCDecoderConfigurationRecord的结构,它在ISO 14496-15, 5.2.4.1中定义。其基本结构如下。
关于SPS和PPS的具体结构属于H264编码的内容,涉及到指数哥伦布编码,这里就不再展开了,有机会在讲H264编码时在详细介绍。
AVC包类型为1时,负载部分是NALUs,其基本结构是长度+NALU[+长度+NALU]
。NALU里面就是经过编码的视频数据。
实战
第一步还是先定义出需要的数据结构。
type FlvVideoTag struct {Header FlvTagHeaderFrameType uint8CodecID uint8Data stream.Stream
}type AVCPacket struct {AVCPacketType uint8CompositionTimeOffset uint32Data stream.Stream
}type AVCDecoderConfigurationRecord struct {ConfigurationVersion uint8AVCProfileIndication uint8ProfileCompatibility uint8AVCLevelIndication uint8LengthSizeMinusOne uint8NumOfSPS uint8SPSLength uint16SPS []byteNumOfPPS uint8PPSLength uint16PPS []byte
}
接下来是解码代码。
// 解码FLV视频Tag
func DecodeFlvVideoTag(t FlvTag) (v FlvVideoTag, err error) {v.Header = t.Headervar b byteif err = t.Data.Byte(&b).Error(); err != nil {return}v.FrameType = b >> 4 & 0x0Fv.CodecID = b & 0x0Fv.Data, err = t.Data.Produce(t.Data.Remain())return
}// 解码AVC包
func DecodeAVCPacket(t FlvVideoTag) (p AVCPacket, err error) {if t.CodecID != CODEC_AVC {err = errors.New("not avc format")}err = t.Data.U8(&p.AVCPacketType).U24(&p.CompositionTimeOffset).Error()if err != nil {return}p.Data, err = t.Data.Produce(t.Data.Remain())return
}// 解码AVCDecoderConfigurationRecord
func DecodeAVCDecoderConfigurationRecord(p AVCPacket) (a AVCDecoderConfigurationRecord, err error) {err = p.Data.U8(&a.ConfigurationVersion).U8(&a.AVCProfileIndication).U8(&a.ProfileCompatibility).U8(&a.AVCLevelIndication).U8(&a.LengthSizeMinusOne).U8(&a.NumOfSPS).U16(&a.SPSLength).Error()a.LengthSizeMinusOne &= 0x03a.NumOfSPS &= 0x1Fif err != nil {return}if a.SPS, err = p.Data.Slice(int(a.SPSLength)); err != nil {return}if err = p.Data.U8(&a.NumOfPPS).U16(&a.PPSLength).Error(); err != nil {return}a.PPS, err = p.Data.Slice(int(a.PPSLength))return
}
关于FLV文件的格式和解析就介绍到这里,完结撒花。
【Go】FLV文件解析(四)相关推荐
- 【Go】FLV文件解析(二)
书接上回,我们继续来解析FLV文件的内容,这次要解析的是元数据Tag的内容,需要注意的是不是每个FLV文件都有这个Tag的. 在有些教程中,元数据Tag也被称作Script Tag.在官方文档中其实是 ...
- 【Go】FLV文件解析(三)
生命不息,编程不止.本章我们继续解析FLV文件中的音频Tag的内容. Audio Tag Data 在[Go]FLV文件解析(一)中我们讲了FLV Tag的基本结构是Tag Header加Tag Da ...
- 【Go】FLV文件解析(一)
这是一个系列教程,一是为了解释FLV文件的结构,二是为了练习Go语言,希望大家多多支持. 在实战编码之前,我们需要首先了解FLV文件的格式.FLV是adobe出品的视频封装格式,注意它只是封装格式,不 ...
- BIN,S19,M0T,SREC,HEX文件解析;FileParse(二)之源码解析
简介 一.摘要 1.描述 2.关键字 二.为何选择C#解析 三.BIN文件解析 四.BIN文件生成 五.S19,M0T,SREC文件解析 六.S19,M0T,SREC文件生成 七.HEX文件解析 八. ...
- <四>关于flv格式解析
关于ffmpeg这里插入一个章节-----关于flv格式的解析,因为在ffmpeg推流的过程中,最流行的就是将数据封装成flv格式,通过rtmp传输,所以搞明白flv的格式构成是十分有必要的,我可能会 ...
- (转)rtmp协议简单解析以及用其发送h264的flv文件
Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的.按照文档上面的流程,server和client连接之后首先要进行握手,握手成功之后进行一些交互,其实就是交互 ...
- 分析FLV文件分析和解析器的开源代码
分析一下GitHub上一份FLV文件分析和解析器的开源代码 GitHub源码地址:功能强大的 FLV 文件分析和解析器 :可以将flv文件的视频tag中的h264类型数据和音频tag中的aac类型数据 ...
- 音视频之解析flv文件实战
参考文章看的是 http://www.360doc.com/content/16/1013/17/474846_598171645.shtml 测试文件 相关文件和部分工具 csdn下载链接 cuc_ ...
- 音视频学习(四、FLV格式解析)
由于上一节使用到了rtmp推流,然后一直推一直出错,用rtmp推流的数据格式是FLV,所以这一节分析一下FLV的格式,补充补充知识. 4.1 FLV格式解析 4.1.1 FLV总体认识 FLV 是FL ...
最新文章
- 软件测试--测试Demo
- zabbix安装报错
- python实现八皇后问题(百练OJ:2754:八皇后)
- performance 查看页面性能
- linux shell脚本编程技巧介绍(一)
- 数据字典怎么写_求职数据分析,项目经验该怎么写
- 将bgr彩色矩阵归一化到0-255之间 【RGB image normalization】
- 求护士的心理阴影面积 | 今日最佳
- 庖丁解牛|图解 MySQL 8.0 优化器查询转换篇
- Flutter 中的国际化之多语言环境
- 清华博士导师整理:Tensorflow和Pytorch的笔记(包含经典项目实战)
- Makefile:Makefile中的调试打印方法
- Scan chain/SE,SI,SO 带scan的寄存器
- JCreator 使用技巧
- 使用google service定位服务
- 程序员常用字体(vs字体修改方案)
- 谷歌浏览器安装 elasticsearch-head 插件
- c语言设计一个语音识别程序,用 C# 开发自己的语音识别程序
- 波士顿法律第一至五季/全集Boston Legal迅雷下载
- 2017,知识与财富