Может ли FFmpeg использоваться в качестве библиотеки вместо автономной программы?

32 [2010-03-08 16:59:00]

Я хочу добавить возможности конвертации видео в программу, которую я пишу. Интерфейс командной строки FFmpeg для этого просто ffmpeg -i InputFile OutputFile, но есть ли способ использовать его как библиотеку, поэтому я могу сделать что-то вроде ffmpeg_convert(InputFile, OutputFile)?

Я надеюсь, что мне не придется напрямую использовать libavcodec, поскольку я предполагаю, что это будет намного сложнее, чем однострочная функция для преобразования между форматами. Если FFmpeg не может быть легко модифицирован, чтобы сделать это, возможно, есть другая библиотека, основанная на этом? Я слышал о libvlc, но это похоже только на просмотр видеоигра API, а не на преобразование видео.

Спасибо.

c ffmpeg mpeg libavcodec ogg


3 ответа


19 Решение Christoph [2010-03-08 19:07:00]

Вам нужны libavcodec и libavformat. FAQ сообщает вам:

4.1 Есть ли примеры, иллюстрирующие использование библиотек FFmpeg, в частности libavcodec и libavformat?

Да. Ознакомьтесь с руководством разработчиков документации FFmpeg. Кроме того, изучите исходный код для одного из многих проектов с открытым исходным кодом, которые уже включают FFmpeg at (projects.html).

Руководство по документации FFmpeg можно найти на ffmpeg.org/documentation.html, включая Руководство разработчика. Я предлагаю взглянуть на libavformat/output-example.c или, возможно, на источник самой утилиты командной строки ffmpeg.


22 Terrence [2010-07-02 18:30:00]

Если вы просто хотите сделать вызов функции ffmpeg как функции, а не системного вызова, вы можете сделать это довольно легко.

в ffmpeg.c, измените:

int main(int argc, char **argv) to int ffmpeg((int argc, char **argv)

Затем в вашем вызове функция ffmpeg и передайте массив, который имитирует командную строку. Чтобы еще проще использовать функцию для создания переменных argc, argv.

static int setargs(char *args, char **argv)
{
    int count = 0;

    while (isspace(*args)) ++args;
    while (*args) {
        if (argv) argv[count] = args;
        while (*args && !isspace(*args)) ++args;
        if (argv && *args) *args++ = '\0';
        while (isspace(*args)) ++args;
        count++;
    }
}

char **parsedargs(char *args, int *argc)
{
    char **argv = NULL;
    int    argn = 0;

    if (args && *args
        && (args = strdup(args))
        && (argn = setargs(args,NULL))
        && (argv = malloc((argn+1) * sizeof(char *)))) {
          *argv++ = args;
          argn = setargs(args,argv);
    }

    if (args && !argv) free(args);

    *argc = argn;
    return argv;
}

void freeparsedargs(char **argv)
{
    if (argv) {
        free(argv[-1]);
        free(argv-1);
    }
}
    return count;
}

int main()
{
    char **argv;
    char *cmd;
    int argc;

    cmd = "ffmpeg -i infile outfile";
    argv = parsedargs(cmd,&argc);
    ffmpeg(argc, argv);
}

5 deddihp [2010-03-17 12:33:00]

Да, вы должны использовать libavcodec и libavformat. Я думаю, вы должны прочитать о ffplay.c внутри исходного кода ffmpeg. Я думаю, вам будет легче начать с этого файла. Во всяком случае, я сделал какое-то приложение, используя эту библиотеку, проверьте его на странице rtstegvideo.sourceforge.net.

Надеюсь, что эта помощь...