【发布时间】: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 被列为编解码器?
【问题讨论】:
-
您使用的是哪个版本的
ffmpeg?av_register_all和av_codec_next已经被弃用了一段时间。 -
n3.3.7,依然使用这个api