新手站长做游戏网站好吗,网站域名用公司注册信息查询,织梦协会网站模板,咨询微平台音视频入门基础#xff1a;H.264专题系列文章#xff1a;
音视频入门基础#xff1a;H.264专题#xff08;1#xff09;——H.264官方文档下载
音视频入门基础#xff1a;H.264专题#xff08;2#xff09;——使用FFmpeg命令生成H.264裸流文件
音视频入门基础…
音视频入门基础H.264专题系列文章
音视频入门基础H.264专题1——H.264官方文档下载
音视频入门基础H.264专题2——使用FFmpeg命令生成H.264裸流文件
音视频入门基础H.264专题3——EBSP, RBSP和SODB
音视频入门基础H.264专题4——NALU Headerforbidden_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_CLOEXECflags | O_CLOEXEC;
#endif
#ifdef O_NOINHERITflags | O_NOINHERIT;
#endiffd open(filename, flags, mode);
#if HAVE_FCNTLif (fd ! -1) {if (fcntl(fd, F_SETFD, FD_CLOEXEC) -1)av_log(NULL, AV_LOG_DEBUG, Failed to set close on exec\n);}
#endifreturn 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属性获取视频帧率的实现》。