FFMPEG:为什么当我调用 av_codec_next() 时没有显示所有编解码器

alv*_*ion 5 c++ ffmpeg h.264 openh264

我正在尝试制作 ffmpeg 的自定义构建以在我的 C++ 应用程序中使用。我唯一需要的编解码器是 h264 和 aac 的编码/解码。因为我无法使用 GPL 代码,所以我尝试使用 openh264。

我成功构建了openh264。

我正在这样配置我的 ffmpeg 构建:

../../../configure\
 --toolchain=msvc\
 --arch=x86_64\
 --enable-shared\
 --prefix=../../../Build/Windows10/x64\
 --disable-programs\
 --disable-everything\
 --enable-libopenh264\
 --extra-ldflags=../../../../openh264/openh264.lib\
 --enable-hwaccel=h264_d3d11va\
 --enable-encoder=libopenh264\
 --enable-encoder=aac\
 --enable-decoder=h264\
 --enable-decoder=aac\
 --enable-muxer=mp4\
 --enable-demuxer=mov\
 --enable-parser=h264\
 --enable-parser=aac\
 --disable-dxva2\
 --enable-protocol=file
Run Code Online (Sandbox Code Playgroud)

这是我的配置输出:

install prefix            ../../../Build/Windows10/x64
source path               /c/ffmpeg
C compiler                cl
C library                 msvcrt
ARCH                      x86 (generic)
big-endian                no
runtime cpu detection     yes
yasm                      yes
MMX enabled               yes
MMXEXT enabled            yes
3DNow! enabled            yes
3DNow! extended enabled   yes
SSE enabled               yes
SSSE3 enabled             yes
AESNI enabled             yes
AVX enabled               yes
XOP enabled               yes
FMA3 enabled              yes
FMA4 enabled              yes
i686 features enabled     yes
CMOV is fast              yes
EBX available             no
EBP available             no
debug symbols             yes
strip symbols             no
optimize for size         no
optimizations             yes
static                    no
shared                    yes
postprocessing support    no
network support           no
threading support         w32threads
safe bitstream reader     yes
texi2html enabled         no
perl enabled              yes
pod2man enabled           no
makeinfo enabled          yes
makeinfo supports HTML    no

External libraries:
libopenh264             schannel                xlib

External libraries providing hardware acceleration:
cuda                    cuvid                   d3d11va                 nvenc

Libraries:
avcodec                 avfilter                avformat                avutil                  swresample              swscale
avdevice

Programs:

Enabled decoders:
aac                     h264

Enabled encoders:
aac                     libopenh264

Enabled hwaccels:
h264_d3d11va

Enabled parsers:
aac                     h264

Enabled demuxers:
mov

Enabled muxers:
mov                     mp4

Enabled protocols:
file

Enabled filters:

Enabled bsfs:

Enabled indevs:

Enabled outdevs:

License: LGPL version 2.1 or later
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它列出了编码器和解码器的两个值。但是,当我尝试像这样列出可用的编解码器时:

av_register_all();
AVCodec* current_codec = av_codec_next(nullptr);
while (current_codec != nullptr)
{
    if (av_codec_is_encoder(current_codec))
    {
        cout << "Found encoder " << current_codec->long_name << endl;
    }
    current_codec = av_codec_next(current_codec);
}
Run Code Online (Sandbox Code Playgroud)

只有第一次调用 av_codec_next 返回非空,并且它是 h264 解码器。我没有看到 aac 解码器,也根本没有看到任何编码器。

我尝试过相同的源代码,但链接到 ffmpeg 的预构建版本(来自 Zeroane),所以我确信迭代编解码器的代码是正确的。

我需要做什么才能将 openh264 和 aac 列为编解码器?

G.M*_*.M. 4

鉴于av_register_all/ av_codec_nextAPI 已被弃用,您可能想尝试av_codec_iterate一下......

const AVCodec *current_codec = nullptr;
void *i = 0;
while ((current_codec = av_codec_iterate(&i))) {
  if (av_codec_is_encoder(current_codec)) {
    std::cout << "Found encoder " << current_codec->long_name << std::endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

似乎按预期工作(Linux + libavcodec.so.58.19.104)。