音视频入门基础:FLV专题(24)——FFmpeg源码中,获取FLV文件视频信息的实现

一、引言

通过FFmpeg命令可以获取到FLV文件的视频压缩编码格式、色彩格式(像素格式)、分辨率、码率、帧率信息:

而由《音视频入门基础:FLV专题(9)------Script Tag简介》和《音视频入门基础:FLV专题(15)------Video Tag简介》可以知道,FLV文件中名称为"onMetadata"的Script Tag、每个Video Tag的VideoTagHeader、AVCDecoderConfigurationRecord(extradata)都会包含视频信息。

名称为"onMetadata"的Script Tag:

每个Video Tag的VideoTagHeader:

AVCDecoderConfigurationRecord:

可以看到,FLV文件中的上述三个地方都会存在视频信息,有些信息比如:视频压缩编码格式、视频帧率、视频分辨率甚至是重复的。所以FFmpeg到底获取的是哪个地方的视频信息呢,本文为大家揭开谜底。

二、视频压缩编码格式

FLV文件中名称为"onMetadata"的Script Tag、每个Video Tag的VideoTagHeader都包含视频压缩编码格式信息。但是FFmpeg获取FLV文件的视频压缩编码格式,是从Video Tag的VideoTagHeader的CodecID属性中获取的、而忽略onMetadata中的:

FFmpeg源码从Video Tag的VideoTagHeader中获取视频压缩编码格式的内部实现原理可以参考:《音视频入门基础:FLV专题(16)------FFmpeg源码中,解码Video Tag的VideoTagHeader的实现》。

三、视频压缩编码格式的profile

FFmpeg获取FLV文件的视频压缩编码格式的profile,是通过SPS的profile_idc属性获取到的,具体可以参考:《音视频入门基础:H.264专题(17)------FFmpeg源码中,获取H.264视频的profile的实现》:

四、视频的色彩格式

FFmpeg获取FLV文件视频的色彩格式,是通过SPS中的属性chroma_format_idc获取到的,具体可以参考:《音视频入门基础:H.264专题(13)------FFmpeg源码中通过SPS属性获取视频色彩格式的实现》:

五、视频分辨率

FLV文件中名称为"onMetadata"的Script Tag、AVCDecoderConfigurationRecord中的SPS都包含视频分辨率信息。但是FFmpeg获取FLV文件的视频分辨率,是通过SPS中的属性获取的、而忽略onMetadata中的。具体可以参考:《音视频入门基础:H.264专题(12)------FFmpeg源码中通过SPS属性计算视频分辨率的实现》:

六、视频码率

FFmpeg获取FLV文件中的视频码率是通过解析名称为"onMetadata"的Script Tag获取的。具体原理跟获取FLV文件中的音频码率一致,具体可以参考:《音视频入门基础:FLV专题(23)------FFmpeg源码中,获取FLV文件音频信息的实现(下)》。由于FFmpeg源码有bug,所以通过FFmpeg命令显示的视频码率不准确:

相关推荐
程序员老陆3 小时前
从零写一个 FFmpeg 播放器:架构设计远比“解码显示”复杂
ffmpeg·音视频·播放器
kuinnebula5 小时前
MP4音频帧定位与提取
音视频
AI创界者8 小时前
开源硬核LTX-Video 本地部署整合包教程:超低显存生成高清AI视频,告别云端排队!
人工智能·aigc·音视频
海带紫菜菠萝汤9 小时前
H.264 宏块划分与码率分配机制:影响压缩效率的关键参数详解
前端·javascript·音视频
音视频牛哥9 小时前
实现低延迟音视频传输,WebRTC并非唯一选择
音视频·webrtc还是rtmp·webrtc还是rtsp·流媒体技术选型·webrtc和rtmp延迟·rtsp低延迟播放器·rtmp低延迟播放器
FFZero110 小时前
[mpv架构] (二) 为什么 mpv 要把 FFmpeg 的 I/O 换掉?
音视频·mpv
code 小楊10 小时前
MiniMax H3震撼发布:2K视频+双声道生成新标杆
人工智能·科技·开源·音视频
开开心心就好11 小时前
文件查重软件批量删除重复文件释放空间
java·开发语言·随机森林·ocr·excel·音视频·最小二乘法
半甜柠檬12 小时前
Agnes 生图生视频 API 接入实战:一个 Skill 的封装过程
音视频·ai生图·agnes·ai生视频
程序员老陆12 小时前
FFmpeg 硬解在 Linux 上:从“能跑”到“跑满 GPU”的实战笔记
linux·笔记·ffmpeg