Я пытаюсь сделать пользовательскую сборку 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 были перечислены как кодеки?
Учитывая, что 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).
Других решений пока нет …