关于d3dva11解码H264编码报-1094995529错误的问题

项目中使用了d3dva11硬解码器解码,参数一切正常,在执行

int ret = avcodec_send_packet(decoder_ctx_, avpkt);

这个函数时报错了,错误码:

AVERROR_INVALIDDATA

也就是-1094995529错误。

经过排查源码,发现这个函数在底层执行的时候,会进行颜色空间检测。吧

cpp 复制代码
#if CONFIG_LCMS2
static int detect_colorspace(AVCodecContext *avctx, AVFrame *frame)
{
    AVCodecInternal *avci = avctx->internal;
    enum AVColorTransferCharacteristic trc;
    AVColorPrimariesDesc coeffs;
    enum AVColorPrimaries prim;
    cmsHPROFILE profile;
    AVFrameSideData *sd;
    int ret;
    if (!(avctx->flags2 & AV_CODEC_FLAG2_ICC_PROFILES))
        return 0;

    sd = av_frame_get_side_data(frame, AV_FRAME_DATA_ICC_PROFILE);
    if (!sd || !sd->size)
        return 0;

    if (!avci->icc.avctx) {
        ret = ff_icc_context_init(&avci->icc, avctx);
        if (ret < 0)
            return ret;
    }

    profile = cmsOpenProfileFromMemTHR(avci->icc.ctx, sd->data, sd->size);
    if (!profile)
        return AVERROR_INVALIDDATA;

    ........
}

也就是cmsOpenProfileFromMemTHR 这个函数报错了,经过Chatgpt,这个函数是预加载颜色空间后,与实际的传入的颜色内存空间进行校对。校对失败就会出现这个问题。

具体为什么为什么会失败?解码器的配置都是正确的,一番操作,发现是H264 profile的问题

H264有多种profile

Base Profile

Main Profile

High Profile

简称为BP,MP,HiP这三种配置,Base Profile是对于一些比较差的设备用来解码的。颜色空间肯定较少且功能少。

问题的根本就在于D3Dva11硬解码器,是不支持BP的,他对H264的颜色空间有一定要求。所以更改了相机的编码配置,就一切正常了。

相关推荐
陈陈陈建蕾8 小时前
Mac使用FFmpeg进行屏幕录制,并使用VLC本地播放
ffmpeg·github
vivo互联网技术11 小时前
Android动效探索:彻底弄清如何让你的视频更加酷炫
android·ffmpeg·跨平台·图形·mediaplayer·纹理·opengl es·坐标系
stereohomology1 天前
ffmpeg视频mp4到gif用大模型很方便
ffmpeg·音视频
f***45322 天前
从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
ffmpeg
努力还债的学术吗喽3 天前
ffmpeg离线安装到服务器:解决conda/sudo/无法安装的通用方案
服务器·ffmpeg·conda
zymill4 天前
hysAnalyser --- UDP实时流分析使用指南
ffmpeg·ts流分析·mpegts·音视频分析·数字电视流录制·audio vivid·视频分析工具
Everbrilliant894 天前
FFmpeg解码音频数据AudioTrack/OpenSL播放
ffmpeg·音视频·audiotrack·opensl·ffmpeg音频解码播放·decodethread·opensl播放与解码同步
海南java第二人7 天前
数据库范式详解:从冗余到规范的升华之旅
数据库·oracle·ffmpeg
mortimer7 天前
只需三步,动手搭建一个本地免费【实时语音转录】工具WhisperLiveKit
ffmpeg·github·openai
Hi202402179 天前
消除FFmpeg库的SONAME依赖
linux·ffmpeg