音视频入门基础: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帧;值为3表示是H.263的disposable inter frame;值为4表示是给服务器保留的生成的关键帧;值为5表示是视频信息/命令帧。

CodecID:占4位,编解码器的标识符,表示该Video Tag的视频数据使用的是哪种视频压缩编码方式。值为2表示是Sorenson H.263;值为3表示是屏幕视频;值为4表示是On2 VP6;值为5表示是带alpha通道的On2 VP6;值为6表示是屏幕视频的版本2;值为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(简称CTS),即PTS相对于DTS的偏移值;AVCPacketType属性的值为其它时,CompositionTime属性的值为0。

从《音视频入门基础:FLV专题(7)------Tag header简介》中可以知道,Tag header的第5到第8个字节为该音视频帧的解码时间戳(DTS)。所以该音视频帧的显示时间戳(PTS) = DTS + CTS。

三、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,VIDEODATA为AVCDecoderConfigurationRecord;如果AVCPacketType的值为1,VIDEODATA包含一个或多个NALU;如果AVCPacketType的值为2,表示这段H.264码流结束,VIDEODATA没有数据。

相关推荐
可乐鸡翅yeah_24 分钟前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
apple_692658852 小时前
最新ComfyUI 0.37.1使用教程:画图、3D、音频都有改动 ComfyUI升级到0.37.1啦,新增或改进五大功能
音视频
VidDown7 小时前
从视频画面里提取文字:OCR、文字检测与结构化输出
python·网络协议·ocr·音视频·视频编解码·视频
音视频牛哥9 小时前
一帧视频的底层工程:像素格式、内存带宽、GPU 与 AI
音视频·像素格式·yuv rgb·nv12 nv21·rgb565·rtsp yuv·rtmp rgb
VidDown9 小时前
文件没问题但网页播不了:播放器接入实战与那些“环境问题
python·网络协议·音视频·视频编解码·视频
the3clipse10 小时前
视频编码技术如何赋能游戏性能优化:从硬件隔离到AI驱动的带宽革命
游戏·性能优化·音视频·视频编码·硬件加速·ai编码·自适应编码
I Am a robert girl10 小时前
打破音频生态壁垒:用 WinAirCast 把 Windows 声音塞进 HomePod
windows·音视频·跨平台开发·音频串流·airplay 2·homepod
揽秀亭长10 小时前
视频转脚本有哪些技术路线?三种常见方案对比分析
人工智能·音视频
VidDown11 小时前
从一堆脚本到能维护的系统:视频处理管道的工程化
服务器·ffmpeg·音视频·视频编解码
轻口味11 小时前
HarmonyOS 7 新特性2:音频编创——轻音台里的降噪、环绕与格式转换
华为·音视频·harmonyos·鸿蒙·音频编创