Кодировать видео с H.264, используя FFmpeg в Windows - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь кодировать видео с помощью H.264, используя FFmpeg (AV_CODEC_ID_H264), но я не могу правильно инициализировать кодек. Никаких проблем при использовании другого кодека, например AV_CODEC_ID_MPEG1VIDEO.

avcodec_register_all();

auto codec = avcodec_find_encoder(AV_CODEC_ID_H264);
if (!codec) { return false; }

auto codec_context = avcodec_alloc_context3(codec);
if (!codec_context) { return false; }

codec_context->codec_id = codec->id;
codec_context->codec_type = AVMEDIA_TYPE_VIDEO;

codec_context->width = w; // w = 1280 on tests
codec_context->height = h; // h = 1024 on tests
codec_context->bit_rate = w * h * 4;

codec_context->time_base = { 1, fps }; // fps = 50 on tests
codec_context->framerate = { fps, 1 };

codec_context->gop_size = 10;

codec_context->pix_fmt = AV_PIX_FMT_YUV420P;

if (codec->id == AV_CODEC_ID_H264) {
    av_opt_set(codec_context->priv_data, "preset", "veryfast", 0);
}

if (avcodec_open2(codec_context, codec, nullptr) < 0) { return false; } // < Fails here

Первое сообщение об ошибке, которое я получил:

[h264_amf @ 08e75900] DLL amfrt32.dll не удалосьopen

Насколько мне удалось обнаружить, эта DLL принадлежит к Advanced Media Framework, SDK для доступа к ускорению HW от оборудования AMD. У меня нет карты AMD, поэтому на моем компьютере не установлены ни драйверы, ни SDK. В любом случае, я скачал SDK и скопировал DLL-файлы драйвера в мой каталог binaries. Отсутствующая ошибка DLL была удалена, но, как и ожидалось, модуль был неправильно инициализирован:

[h264_amf @ 0375b600] CreateComponent (AMFVideoEncoderVCE_AVC) завершился ошибкой 13

Вопрос: Я что-то упускаю (параметры, зависимости)? Есть ли способ отключить ускорение AMF или пометить его как необязательный / автоопределение / что угодно?

PS: я ожидаю запустить исполняемый файл кодирования в очень разнородной клиентской базе,предполагается, что Windows 10 и ничего больше, поэтому я не могу пометить как обязательные для конкретного производителя ускорения.

PS: я использую предварительно скомпилированную сборку LGPL FFmpeg 4.2.1 из https://ffmpeg.zeranoe.com/builds/ для Windows 32 бита. Мой код компилируется с использованием Visual Studio 2017.

Если проблема в скомпилированной версии, я рад ее пересозданию. Если да, то какие параметры конфигурации мне следует использовать при сборке x264 или ffmpeg?

...