音视频入门基础:H.264专题(17)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程
创始人
2025-02-11 05:04:29
0

=================================================================

音视频入门基础:H.264专题系列文章:

音视频入门基础:H.264专题(1)——H.264官方文档下载

音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件

音视频入门基础:H.264专题(3)——EBSP, RBSP和SODB

音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介

音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析

音视频入门基础:H.264专题(6)——FFmpeg源码:从H.264码流中提取NALU Header、EBSP、RBSP和SODB

音视频入门基础:H.264专题(7)——FFmpeg源码中 指数哥伦布编码的解码实现

音视频入门基础:H.264专题(8)——H.264官方文档的描述符

音视频入门基础:H.264专题(9)——SPS简介

音视频入门基础:H.264专题(10)——FFmpeg源码中,存放SPS属性的结构体和解码SPS的函数分析

音视频入门基础:H.264专题(11)——计算视频分辨率的公式

音视频入门基础:H.264专题(12)——FFmpeg源码中通过SPS属性计算视频分辨率的实现

音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现

音视频入门基础:H.264专题(14)——计算视频帧率的公式

音视频入门基础:H.264专题(15)——FFmpeg源码中通过SPS属性获取视频帧率的实现

音视频入门基础:H.264专题(16)——FFmpeg源码中,判断某文件是否为H.264裸流文件的实现

音视频入门基础:H.264专题(17)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程

=================================================================

一、引言

本文对之前音视频入门基础H.264专题(1)到(16)中的内容进行一个总结。通过FFmpeg命令可以获取到AnnexB格式的H.264裸流文件的信息,包括视频压缩编码格式、色彩格式、视频分辨率、帧率:

二、FFmpeg源码获取H.264裸流文件信息的内部实现原理

(一)打开H.264裸流文件

执行命令:./ffmpeg -i output.h264时,FFmpeg内部会执行avformat_open_input函数,而该函数内部会调用avpriv_open函数,打开需要被解析的H.264裸流文件。

avpriv_open函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为5.0.3)的源文件libavutil/file_open.c中:

int avpriv_open(const char *filename, int flags, ...) {     int fd;     unsigned int mode = 0;     va_list ap;      va_start(ap, flags);     if (flags & O_CREAT)         mode = va_arg(ap, unsigned int);     va_end(ap);  #ifdef O_CLOEXEC     flags |= O_CLOEXEC; #endif #ifdef O_NOINHERIT     flags |= O_NOINHERIT; #endif      fd = open(filename, flags, mode); #if HAVE_FCNTL     if (fd != -1) {         if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)             av_log(NULL, AV_LOG_DEBUG, "Failed to set close on exec\n");     } #endif      return fd; }

可以看到avpriv_open函数内部通过系统调用 fd = open(filename, flags, mode) 打开需要被解析的H.264裸流文件,得到文件描述符fd。


 

(二)读取H.264裸流文件的数据

然后avformat_open_input函数内部会调用file_read函数读取H.264裸流文件的内容(二进制数据)。

file_read函数定义在FFmpeg源码的源文件libavformat/file.c中:

static int file_read(URLContext *h, unsigned char *buf, int size) {     FileContext *c = h->priv_data;     int ret;     size = FFMIN(size, c->blocksize);     ret = read(c->fd, buf, size);     if (ret == 0 && c->follow)         return AVERROR(EAGAIN);     if (ret == 0)         return AVERROR_EOF;     return (ret == -1) ? AVERROR(errno) : ret; }

可以看到file_read函数内部通过系统调用 ret = read(c->fd, buf, size)读取H.264裸流文件的内容,并将其保存到缓存区buf中。

(三)判断该文件是否为H.264裸流文件

然后avformat_open_input函数内部通过h264_probe函数判断该文件是否为AnnexB格式的H.264裸流文件。具体可以参考:《音视频入门基础:H.264专题(16)——FFmpeg源码中,判断某文件是否为H.264裸流文件的实现》。

(四)获取色彩格式、视频分辨率、帧率等信息

然后FFmpeg内部会调用avformat_find_stream_info函数,在该函数内部,首先通过ff_h264_decode_seq_parameter_set函数解码SPS,得到SPS中的属性(具体可以参考:《音视频入门基础:H.264专题(10)——FFmpeg源码中,存放SPS属性的结构体和解码SPS的函数分析》)。然后在parse_nal_units函数中,根据上述获取到的SPS中的属性,计算出色彩格式、视频分辨率和帧率(具体可以参考:《音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现》、《音视频入门基础:H.264专题(12)——FFmpeg源码中通过SPS属性计算视频分辨率的实现》、《音视频入门基础:H.264专题(15)——FFmpeg源码中通过SPS属性获取视频帧率的实现》。

相关内容

热门资讯

最终!微乐小程序免费黑科技,微... 最终!微乐小程序免费黑科技,微乐自建房辅助入口官网(作弊器)讲义教程(果然真的是有挂)1、玩家可以在...
微乐小程序存在有挂!小程序微乐... 微乐小程序存在有挂!小程序微乐辅助器免费版(开挂)插件-本来总结是真的挂1、每一步都需要思考,不同水...
透视教你!微乐小程序黑科技(外... 透视教你!微乐小程序黑科技(外挂),微信微乐游戏苹果辅助器,教程教材(了解有挂)-哔哩哔哩;1、操作...
据目击者称!微乐小程序免费黑科... 据目击者称!微乐小程序免费黑科技,微乐小程序自建房透视免费(作弊器)要领教程(其实是真的挂)1、金币...
透视详情!微乐小程序黑科技(外... 透视详情!微乐小程序黑科技(外挂),2025微乐小程序黑科技,教程手册(有挂解惑)-哔哩哔哩1)辅助...
微乐小程序黑科技!微乐锄大地脚... 微乐小程序黑科技!微乐锄大地脚本(开挂)软件-一贯科普存在有挂1、玩家可以在透视最简单三个步骤对游戏...
长期以来!微乐小程序免费黑科技... 长期以来!微乐小程序免费黑科技,微乐福建辅助器(作弊器)诀窍教程(原来是真的挂)1、完成有辅助插件,...
透视有挂!微乐小程序黑科技(外... 透视有挂!微乐小程序黑科技(外挂),微乐小程序怎么挂脚本,教程攻略(有挂规律)-哔哩哔哩1、辅助软件...
微乐小程序存在有挂!微信小程序... 微乐小程序存在有挂!微信小程序辅助多少钱(开挂)脚本-竟然解迷真的是有挂1、不需要AI权限,帮助你快...
据权威媒体报道!微乐小程序黑科... 据权威媒体报道!微乐小程序黑科技,微信小程序微乐辅助器免费版v2.0免费(作弊器)积累教程(真是是有...