【问题标题】:libvpx "Codec does not implement requested capability" (decoder)libvpx“编解码器未实现请求的功能”(解码器)
【发布时间】:2021-11-07 15:36:45
【问题描述】:

我目前在使用 libvpx v1.10.0 (https://github.com/webmproject/libvpx/releases) 的项目中遇到问题。

我已在 Windows 10 (PC x64) 上成功构建 Visual Studio 16 库。
[我必须自己构建 libvpx,因为我需要它在Windows 10 ARM64 / VS16 以及(Hololens 2),并且没有官方提供这样的构建]

我制作了一个 C++ DLL,它使用来自 libvpx 的静态库(在 Unity 中用作本机插件)。 虽然 VP9 编码部分似乎在使用我的 DLL 的示例应用程序中正常工作,但我无法初始化 VP9 解码器。也许我在 libvpx 的配置步骤中遗漏了什么?

为了构建 libvpx 静态库,我从 Visual Studio 2019 的 x64 Native Tools 命令提示符启动了 MSYS2。 然后,我设置了如下配置,灵感来自我们在 ArchLinux AUR 包 (https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=libvpx-git) 中可以找到的内容:

./configure --target=x86_64-win64-vs16 --enable-libyuv \
--enable-vp8 --enable-vp9 --enable-postproc --enable-vp9-postproc \
--enable-vp9-highbitdepth --enable-vp9-temporal-denoising
make -j

在编译结束时,构建成功,出现 0 个错误,但出现 2 个警告。配置脚本的--help 表示--enable-vp9 选项同时启用VP9 编码器和解码器。

然后,当我使用执行编码和解码的 C++ DLL 运行我的应用程序时,我从 libvpx 收到以下错误消息: 编解码器没有实现请求的功能

当我调用vpx_codec_dec_init() 函数时会发生这种情况。我不明白为什么它无法初始化,因为我认为 VP9 编解码器已完全构建。当我将 --enable-vp9-encoder 和 --enable-vp9-decoder 选项以及所有其他与 VP9 相关的选项添加到配置中时,也会出现错误。

在初始化 VP9 解码器之前,代码本身有什么需要做的吗?我在代码示例中没有看到这样的东西。请注意,如果我也使用 VP8 也会出现问题(编码 OK / 解码 KO,同样的错误)。

这是我解码帧的函数的开始:

vpx_codec_err_t resultError;
vpx_codec_ctx_t codec;
const vpx_codec_iface_t* decoderInterface = vpx_codec_vp9_cx(); // >>> OK!

if (!decoderInterface)
{
    return "libvpx: unsupported codec (decoder)";
}

resultError = vpx_codec_dec_init(&codec, decoderInterface, nullptr, 0); // >>> KO...
if (resultError)
{
    std::cout << vpx_codec_error(&codec) << std::endl; // outputs "Codec does not implement requested capability"
    return "libvpx: failed to initialize decoder";
}

vpx_codec_iter_t iter = nullptr;
vpx_image_t* yuvFrame = nullptr;

resultError = vpx_codec_decode(&codec, compressedFrame, (unsigned int)compressedFrameSize, nullptr, 0);

if (resultError)
{
    return "libvpx: failed to decode frame";
}

// ....

任何帮助都会很棒!谢谢你。 :)

【问题讨论】:

    标签: c++ runtime-error decoder libvpx


    【解决方案1】:

    好的,我想通了! :)

    电话:
    const vpx_codec_iface_t* decoderInterface = vpx_codec_vp9_cx();

    必须替换为 (+ #include &lt;vpx/vp8dx.h&gt;):
    const vpx_codec_iface_t* decoderInterface = vpx_codec_vp9_dx();

    我出现此错误的原因是之前在编码/解码视频方面的经验。我使用 H.264 编解码器开发了一个网络摄像头流媒体应用程序,它需要一个设置的“上下文”结构。因此,由于 vpx_codec_vp9_cx() 函数的名称,我认为它正在为 VP9 创建这样的上下文。事实上,cx 匹配编码,dx 匹配解码......虽然不是很明显。我不喜欢这种函数名。

    无论如何,我希望它可以帮助处于相同情况的任何人。 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 2017-03-24
      • 1970-01-01
      • 2010-10-19
      • 2017-02-16
      • 2019-05-27
      • 2017-04-07
      • 2018-06-08
      相关资源
      最近更新 更多