【问题标题】:FFMPEG: Why aren't all my codecs showing up when I call av_codec_next()FFMPEG:为什么当我调用 av_codec_next() 时没有显示所有编解码器
【发布时间】:2018-11-29 19:55:21
【问题描述】:

我正在尝试自定义构建 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

这是我的配置输出:

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

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

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);
}

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

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

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

【问题讨论】:

  • 您使用的是哪个版本的ffmpegav_register_allav_codec_next 已经被弃用了一段时间。
  • n3.3.7,依然使用这个api

标签: c++ ffmpeg h.264 openh264


【解决方案1】:

鉴于 av_register_all/av_codec_next API 已被弃用,您可能想改用 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;
  }
}

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

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2014-05-18
    • 1970-01-01
    相关资源
    最近更新 更多