LINUX.ORG.RU

Как распарсить версию ffmpeg из программы

 ,


0

2

Привет, ЛОР.

Не секрет, что в библиотеках ffmpeg неоднократно ломали API. Поэтому важно проверять их версию на этапе компиляции.

В libavutil есть ffversion.h. Однако вместо понятных XXX_VER_MAJOR и XXX_VER_MINOR там определяется строка. Например, для старенького ffmpeg 3.2 написано:

#define FFMPEG_VERSION "3.2

А для более новых, так и вообще с буковками:

#define FFMPEG_VERSION "n4.4.5"

или

#define FFMPEG_VERSION "n7.1"

Как вы думаете, как в таких условиях написать #if для препроцессора, что код ниже действителен, например, для ffmpeg 4 и выше? Например, в совсем древних ffmpeg-ах была функция avcodec_register_all(), потом её выкинули, а потом выкинули и av_register_all(). И это только одна из «мутаций».

★★★★★

ffmpeg состоит из нескольких библиотек. У каждой своя версия. С числами, как ты любишь. Смотри файл не ffversion.h, а от конкретной библиотеки, например libavcodec/version.h

ox55ff ★★★★★
()

В libavutil есть ffversion.h. Однако вместо понятных XXX_VER_MAJOR и XXX_VER_MINOR там определяется строка. Например, для старенького ffmpeg 3.2 написано:

Есть ещё version.h (как для libavutil, так и для остальных компонент), где части версии описаны отдельными циферками.

Bfgeshka ★★★★★
()

Можно рассмотреть другой путь с проверкой нужных символов, особенно может подойти если тебе нужен ограниченный набор функций:

https://cmake.org/cmake/help/latest/module/CheckSymbolExists.html

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 3)
Ответ на: комментарий от MOPKOBKA

Если ты допускаешь запускать какие-то внешние проги кроме компилятора - то способов куча, очевидно. А тема вроде про то как именно с помощью препроцессора всё сделать.

firkax ★★★★★
()
Ответ на: комментарий от a1ba

Спасибо, но судя по вызову avutil_version(), оно рантаймовое.

А я хотел в compile time выявлять, какие функции доступны.

Пока склоняюсь к тому, что действительно придётся каждую из библиотек проверять отдельно, как выше посоветовали.

В принципе, необходимую версию по чейнджлогам наскрести можно, например, на упомянутые мной функции регистрации информация есть:

lavf 58.9.100 - avformat.h
  Deprecate use of av_register_input_format(), av_register_output_format(),
  av_register_all(), av_iformat_next(), av_oformat_next().

На эти 58.9.100 и придётся опираться, хотя это более громоздко, чем если бы была возможность поделить «в целом» по поколениям ffmpeg.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от hobbit

У меня оба варианта, с чем компилилось и с чем запускается.

Так же по коду есть пример как проверять версию, так как я свой код запускал и на чуть более старой версии ffmpeg.

a1ba ★★
()

Последний раз я бодался с версиями API ffmpeg очень давно, но с тех пор мне запомнилось, что версии библиотек — не самый лучший способ определить, есть ли та или иная фича. Иногда не было чёткой границы, где все версии младше определённой имели фичу, а все версии старше — ещё нет. Для разных веток нужны были отдельные проверки, и это было жутко неудобно и столь же ненадёжно.

Самый по моему мнению лучший способ — пробовать собирать тестовые программки во время конфигурации исходников, и по результатам создавать config.h, макро-константами из которого потом и оборачивать те или иные места в основном коде.

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

Очередное подтверждение тезису, что чем наглее и развязнее анонимус (да и не только анонимус), тем меньше у него понимания, о чём речь идёт.

По ссылке:

Extract version components from the full AV_VERSION_INT int as returned by functions like avformat_version() and avcodec_version()

Между тем я ясно написал, что речь идёт о проверках на этапе компиляции. И даже показал, в каком виде оно препроцессору даётся – никакой там не int даже близко.

Пока что самое реалистичное, как я думаю – проверять версии отдельных библиотек, как, собственно, и посоветовали в первых комментариях. Для них всё нужное есть.

hobbit ★★★★★
() автор топика