4

I'm trying to make a custom build of ffmpeg to use in my c++ application. The only codecs I need are encode/decode for h264 and aac. Because I cannot use GPL code, I'm trying to use openh264.

I successfully built openh264.

I am configuring my ffmpeg build thusly:

../../../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

Here is my configure output:

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

As you can see, it is listing two values each for encoders and decoders. HOWEVER, when I try to list the codecs available like so:

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

Only the first call to av_codec_next returns non-null, and it is the h264 decoder. I don't see the aac decoder, and I don't see any encoders at all.

I've tried the same source code but linking to a prebuilt version of ffmpeg (from Zeroane), so I'm sure the code to iterate over the codecs is correct.

What do I need to do to get openh264 and aac to be listed as codecs?

4

1 回答 1

2

鉴于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;
  }
}

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

于 2018-06-21T14:27:13.823 回答