1

我目前在使用 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 收到此错误消息: Codec does not implement requested capability

它发生在我调用该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";
}

// ....

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

4

1 回答 1

0

好的,我想通了!:)

该行:
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......虽然不是很明显。我不喜欢这种函数名。

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

于 2021-09-11T16:20:57.437 回答