libvpx "Codec does not implement requested capability" (decoder)



我目前在一个使用libvpx v1.10.0(https://github.com/webmproject/libvpx/releases)。

我已在Windows 10(PC x64)上成功构建了Visual Studio 16库
[I必须自己构建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";
}
// ....

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

好吧,我已经想通了!:)

线路:
const vpx_codec_iface_t* decoderInterface = vpx_codec_vp9_cx();

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

我犯这个错误的原因是以前在视频编码/解码方面的经验。我已经开发了一个使用H.264编解码器的网络摄像头流媒体应用程序;上下文";结构因此,由于vpx_codec_vp9_cx()函数的名称,我认为它为VP9创建了这样一个上下文。事实上,cx用于编码,dx用于解码。。。但不是很明显。我不喜欢这种函数名。

无论如何,我希望它能帮助任何处于同样情况的人

相关内容

最新更新