终于到了完结的时刻,这期我们来解析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文件解析(四)相关推荐

  1. 【Go】FLV文件解析(二)

    书接上回,我们继续来解析FLV文件的内容,这次要解析的是元数据Tag的内容,需要注意的是不是每个FLV文件都有这个Tag的. 在有些教程中,元数据Tag也被称作Script Tag.在官方文档中其实是 ...

  2. 【Go】FLV文件解析(三)

    生命不息,编程不止.本章我们继续解析FLV文件中的音频Tag的内容. Audio Tag Data 在[Go]FLV文件解析(一)中我们讲了FLV Tag的基本结构是Tag Header加Tag Da ...

  3. 【Go】FLV文件解析(一)

    这是一个系列教程,一是为了解释FLV文件的结构,二是为了练习Go语言,希望大家多多支持. 在实战编码之前,我们需要首先了解FLV文件的格式.FLV是adobe出品的视频封装格式,注意它只是封装格式,不 ...

  4. BIN,S19,M0T,SREC,HEX文件解析;FileParse(二)之源码解析

    简介 一.摘要 1.描述 2.关键字 二.为何选择C#解析 三.BIN文件解析 四.BIN文件生成 五.S19,M0T,SREC文件解析 六.S19,M0T,SREC文件生成 七.HEX文件解析 八. ...

  5. <四>关于flv格式解析

    关于ffmpeg这里插入一个章节-----关于flv格式的解析,因为在ffmpeg推流的过程中,最流行的就是将数据封装成flv格式,通过rtmp传输,所以搞明白flv的格式构成是十分有必要的,我可能会 ...

  6. (转)rtmp协议简单解析以及用其发送h264的flv文件

    Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的.按照文档上面的流程,server和client连接之后首先要进行握手,握手成功之后进行一些交互,其实就是交互 ...

  7. 分析FLV文件分析和解析器的开源代码

    分析一下GitHub上一份FLV文件分析和解析器的开源代码 GitHub源码地址:功能强大的 FLV 文件分析和解析器 :可以将flv文件的视频tag中的h264类型数据和音频tag中的aac类型数据 ...

  8. 音视频之解析flv文件实战

    参考文章看的是 http://www.360doc.com/content/16/1013/17/474846_598171645.shtml 测试文件 相关文件和部分工具 csdn下载链接 cuc_ ...

  9. 音视频学习(四、FLV格式解析)

    由于上一节使用到了rtmp推流,然后一直推一直出错,用rtmp推流的数据格式是FLV,所以这一节分析一下FLV的格式,补充补充知识. 4.1 FLV格式解析 4.1.1 FLV总体认识 FLV 是FL ...

最新文章

  1. 软件测试--测试Demo
  2. zabbix安装报错
  3. python实现八皇后问题(百练OJ:2754:八皇后)
  4. performance 查看页面性能
  5. linux shell脚本编程技巧介绍(一)
  6. 数据字典怎么写_求职数据分析,项目经验该怎么写
  7. 将bgr彩色矩阵归一化到0-255之间 【RGB image normalization】
  8. 求护士的心理阴影面积 | 今日最佳
  9. 庖丁解牛|图解 MySQL 8.0 优化器查询转换篇
  10. Flutter 中的国际化之多语言环境
  11. 清华博士导师整理:Tensorflow和Pytorch的笔记(包含经典项目实战)
  12. Makefile:Makefile中的调试打印方法
  13. Scan chain/SE,SI,SO 带scan的寄存器
  14. JCreator 使用技巧
  15. 使用google service定位服务
  16. 程序员常用字体(vs字体修改方案)
  17. 谷歌浏览器安装 elasticsearch-head 插件
  18. c语言设计一个语音识别程序,用 C# 开发自己的语音识别程序
  19. 波士顿法律第一至五季/全集Boston Legal迅雷下载
  20. 2017,知识与财富

热门文章

  1. Mustache教程
  2. 谷歌地图卫星影像应用到AutoCAD
  3. html height 100%无效,css height:100%撑不起来怎么解决?
  4. 《1.4.ARM裸机第四部分-GPIO和LED》
  5. xcode pods 总结
  6. linux下u盘目录带锁,完美解决linux下U盘文件只读的问题
  7. 康熙环球/青蛙的约会
  8. 音视频编解码类开源项目的18个实时
  9. ABC(人工智能、大数据、云计算)的关系
  10. 记一次关于sharding-jdbcde'shi'yon