音视频入门基础: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);
//...
}
相关推荐
OpenCutAI7 小时前
无字幕视频怎么翻译?跨境出海视频本地化实操指南
音视频
科技小E8 小时前
国标GB28181视频平台EasyGBS监控为什么会“瞎”:视频质量诊断EasyVQD如何揪出黑屏卡顿偏色
大数据·人工智能·音视频
ACP广源盛1392462567311 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 Serdes 长距离视频传输芯片 GSV5800 在私有化 AI 服务中的价值与应用场景
大数据·数据库·人工智能·嵌入式硬件·矩阵·开源·音视频
深圳市宝华视联13 小时前
院感约束下,手术室音视频布线与设备摆放实施注意事项
嵌入式硬件·音视频·实时音视频·视频编解码·嵌入式实时数据库
东莞市奥普新音频技术有限公司13 小时前
国产音频分析仪怎么选?从性能参数、测试软件到自动化能力
人工智能·科技·测试工具·自动化·音视频·音频
hz5678913 小时前
视频会议终端的核心功能与采购指南
运维·音视频·信息与通信·智能硬件
美狐美颜sdk14 小时前
从开发角度分析直播APP:视频美颜SDK接入过程中的技术难点
大数据·人工智能·音视频·美颜sdk·美颜api
EAIReport14 小时前
字节Seedance 2.5深度解析:长时序4K视频生成技术突破与产业落地赋能
大数据·人工智能·音视频
视频技术分享15 小时前
技术拆解与实战优化:国产化视频会议系统核心原理与落地策略
其他·重构·架构·实时互动·音视频