当前位置: 首页 > news >正文

音视频入门基础:FLV专题(15)——Video Tag简介

一、引言

根据《video_file_format_spec_v10_1.pdf》第75页,如果某个Tag的Tag header中的TagType值为9,表示该Tag为Video Tag:

这时StreamID之后紧接着的就是VideoTagHeader,也就是说这时Tag header之后的就是VideoTagHeader:

然后这时如果Filter的值不为1,表示未加密,不需要预处理。则VideoTagHeader之后紧接着的就VIDEODATA:

所以,

1.当某个Tag的Tag header中的TagType属性的值为9时,该Tag为Video Tag;

2.未加密的情况下,一个Video Tag = Tag header + VideoTagHeader + VIDEODATA。

二、VideoTagHeader

根据《video_file_format_spec_v10_1.pdf》第78页,VideoTagHeader包含的属性如下:

其中:

Frame Type:占4位(8位等于1个字节),为该帧的类型。值为1表示是H.264的I帧,值为2表示是H.264的P帧、B帧。

CodecID:占4位,编解码器的标识符。值为7表示是H.264。

AVCPacketType:占1字节,H.264数据包的类型。仅当FLV文件中的视频为H.264格式时,才有该属性。

值为0表示该Video Tag包含AVC sequence header,即此时该Video Tag的VIDEODATA为AVCDecoderConfigurationRecord,关于AVCDecoderConfigurationRecord的概念可以参考:《音视频入门基础:H.264专题(18)——AVCDecoderConfigurationRecord简介》;

值为1表示该Video Tag包含H.264的一个或多个NALU,即此时该Video Tag的VIDEODATA为一个或多个NALU,这些NALU之间用NALUnitLength分隔。FLV等文件格式使用的是avcC包装的H.264,avcC包装的H.264码流中,每个NALU前面没有起始码。avcC通过在每个NALU前加上NALUnitLength,在读取某个NALU之前,先把该NALU前面的NALUnitLength读取出来,拿到该NALU的总长度,然后根据该长度读取相应的字节数,读取出整个NALU。

值为2表示是该Video Tag包含AVC end of sequence,表示这段H.264码流结束。

CompositionTime:占3字节。AVCPacketType属性的值为1时,该值为Composition time offset,即PTS相对于DTS的偏移值;AVCPacketType属性的值为其它时,该值为0。

三、VIDEODATA

根据《video_file_format_spec_v10_1.pdf》第79页,FLV文件未加密时,VIDEODATA为VideoTagBody:

四、VideoTagBody

根据《video_file_format_spec_v10_1.pdf》第79页,当FLV文件的视频压缩编码格式为H.264时,VideoTagBody为AVCVIDEOPACKET:

五、AVCVIDEOPACKET

根据《video_file_format_spec_v10_1.pdf》第79页,AVCPacketType的值为0时,AVCVIDEOPACKET为AVCDecoderConfigurationRecord;当AVCPacketType的值为1时,AVCVIDEOPACKET包含H.264的一个或多个NALU;文档中没有写AVCPacketType的值为2的情况,所以当AVCPacketType的值为2时,AVCVIDEOPACKET没有数据:

六、用flvAnalyser工具分析Video Tag

用flvAnalyser工具可以直接显示Video Tag的各个部分。

AVCPacketType的值为0时:

AVCPacketType的值为1时:

AVCPacketType的值为2时:

七、总结

1.当某个Tag的Tag header中的TagType属性的值为9时,该Tag为Video Tag;

2.未加密的情况下,一个Video Tag = Tag header + VideoTagHeader + VIDEODATA。

3.当FLV文件的视频压缩编码格式为H.264并且未加密时,如果VideoTagHeader中的AVCPacketType的值为0,VIDEODATAAVCDecoderConfigurationRecord;如果AVCPacketType的值为1,VIDEODATA包含一个或多个NALU;如果AVCPacketType的值为2,VIDEODATA没有数据。

http://www.lryc.cn/news/460679.html

相关文章:

  • 尚硅谷rabbitmq2024 第15-18节 springboot整合与可靠性答疑
  • ctfshow-web 萌新题
  • 基于RPA+AI的网页自动填写机器人 | OPENAIGC开发者大赛高校组优秀作品
  • Tmux常用操作--云GPU版
  • 股市入门常见术语介绍
  • 专栏十九:单细胞大数据时代使用scvi和scanpy整合数据
  • C语言编程必备知识
  • k8s 1.28 集群部署
  • python入门教程
  • bat(批处理脚本学习)
  • 【JAVA毕业设计】基于Vue和SpringBoot的渔具租赁系统
  • Maven和Gradle的对比
  • Windows安装Ollama环境
  • Java入门:11.抽象类,接口,instanceof,类关系,克隆
  • 【软件部署安装】OpenOffice转换PDF字体乱码
  • 工程师 - 开源硬件公司Adafruit介绍
  • PostgreSQL学习笔记五:数据库基本操作
  • 住房公积金 计算器-java方法
  • Spring-Smart-DI
  • Python 在树莓派上实现WIFI连接
  • vmware下ubuntu18.04中使用笔记本的摄像头
  • 【Linux】最基本的杂项设备驱动
  • RadioGroup RadioButton底部导航栏
  • SQL分类中的DQL
  • 1.3.ReactOS系统 PAGED_CODE 宏函数的实现
  • 【论文速看】DL最新进展20241015-目标检测、图像超分
  • 京准电钟:NTP时间服务器让大数据时钟同步
  • SSL免费证书申请(七牛云/阿里云等)
  • 十二、结构型(代理模式)
  • 使用 python 下载 bilibili 视频