音视频入门基础:H.264专题(17)——FFmpeg源码中,获取H.264视频的profile的实现

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

音视频入门基础: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视频的profile的实现

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

音视频入门基础:H.264专题(19)------AVCDecoderConfigurationRecord简介

音视频入门基础:H.264专题(20)------FFmpeg源码中,获取avcC封装的H.264码流中每个NALU的长度的实现

音视频入门基础:H.264专题(21)------FFmpeg源码中,解码AVCDecoderConfigurationRecord的实现

音视频入门基础:H.264专题(22)------通过FFprobe显示H.264裸流每个packet的信息

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

一、引言

通过FFmpeg命令可以查看到H.264视频的profile(规格):

cpp 复制代码
./ffmpeg -i XXX

这个profile是通过解码SPS的profile_idc属性获取到的。profile_idc属性固定占1字节,表示当前这路H.264码流的编码档次:

比如,profile_idc的值为66表示是Baseline profile:

profile_idc的值为77表示是Main profile:

profile_idc的值为88表示是Extended profile:

profile_idc的值为100表示是High profile:

除此之外,还有其它profile,具体可以查阅H.264官方文档《T-REC-H.264-202108-I!!PDF-E.pdf》。

二、FFmpeg源码中,获取H.264视频的profile的实现

从文章《音视频入门基础:H.264专题(10)------FFmpeg源码中,存放SPS属性的结构体和解码SPS的函数分析》中,我们可以知道,FFmpeg源码中通过ff_h264_decode_seq_parameter_set函数解码SPS,从而拿到SPS中的属性。

ff_h264_decode_seq_parameter_set函数中通过下面代码解析出SPS中的profile_idc属性, 存贮到sps->profile_idc中:

cpp 复制代码
int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
                                     H264ParamSets *ps, int ignore_truncation)
{
//...
    profile_idc           = get_bits(gb, 8);
//...
    sps->profile_idc          = profile_idc;
//...
}

然后在libavcodec/h264_parser.c的parse_nal_units函数中,通过下面代码将profile_idc属性赋值给AVCodecContext的profile:

cpp 复制代码
static inline int parse_nal_units(AVCodecParserContext *s,
                                  AVCodecContext *avctx,
                                  const uint8_t * const buf, int buf_size)
{
//...
    avctx->profile = ff_h264_get_profile(sps);
//...
}

ff_h264_get_profile函数定义在libavcodec/h264_parse.c中,该函数是用来计算SPS的profile_idc属性和constraint_set?_flags属性的:

cpp 复制代码
/**
 * Compute profile from profile_idc and constraint_set?_flags.
 *
 * @param sps SPS
 *
 * @return profile as defined by AV_PROFILE_H264_*
 */
int ff_h264_get_profile(const SPS *sps)
{
    int profile = sps->profile_idc;

    switch (sps->profile_idc) {
    case AV_PROFILE_H264_BASELINE:
        // constraint_set1_flag set to 1
        profile |= (sps->constraint_set_flags & 1 << 1) ? AV_PROFILE_H264_CONSTRAINED : 0;
        break;
    case AV_PROFILE_H264_HIGH_10:
    case AV_PROFILE_H264_HIGH_422:
    case AV_PROFILE_H264_HIGH_444_PREDICTIVE:
        // constraint_set3_flag set to 1
        profile |= (sps->constraint_set_flags & 1 << 3) ? AV_PROFILE_H264_INTRA : 0;
        break;
    }

    return profile;
}

最后在dump_stream_format函数中,通过avcodec_string函数中的语句:profile = avcodec_profile_name(enc->codec_id, enc->profile)拿到上一步得到的AVCodecContext的profile。再在dump_stream_format函数中将profile打印出来:

cpp 复制代码
void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
{
//...
    profile = avcodec_profile_name(enc->codec_id, enc->profile);
//...
}
相关推荐
归秋14218 小时前
多轨音频智能混音软件怎么选:从 demo 到更完整作品的 AI 后期工具思路
人工智能·音视频
小猴子爱上树21 小时前
跨马翻译:批量图片翻译与视频字幕、智能抠图一站式在线图片翻译工具
大数据·人工智能·python·音视频
每天死循环21 小时前
ComfyUI MiniMax H3文生视频(t2v)提示词教程:四段式写法+5秒768p实测(附模板和参数)
音视频·文生视频·comfyui·ai视频·minimax
企业数字化笔记1 天前
视频像素分割怎么选?HSV 阈值、传统掩膜、语义分割和实例分割的效果与代价
opencv·音视频
Maynor9961 天前
6张商品图→17秒带货短视频:开源12个Claude Skills,配音、字幕花字、BGM本地一条命令出片
ffmpeg·ai编程·claude·电商·agent skills
youdexiang1 天前
AI 生成会议纪要好用吗?多款 APP 功能分析
java·人工智能·音视频
AI创界者1 天前
【开源实战】MiniMax-H3 本地离线高自由度 ComfyUI 工作流搭建指南(含规则松绑与提示词映射)
人工智能·aigc·音视频
AIGC小尼1 天前
8G 显存零基础本地部署 AI 漫剧全流程|ComfyUI+Wan2.2+FFmpeg 离线成片完整方案(含代码 / 指令 / 排坑)
人工智能·ffmpeg·php·comfyui·ai漫剧
hai3152475431 天前
文本矩阵化拆解与视频矩阵化构建
线性代数·矩阵·音视频
昨日之日20061 天前
Visual Enhancer:一键让模糊照片视频变清晰,升分辨率、插帧、转HDR,一键搞定素材修复
计算机视觉·音视频