Можно ли использовать FFmpeg в качестве библиотеки вместо отдельной программы? - PullRequest
40 голосов
/ 08 марта 2010

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

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

Спасибо.

Ответы [ 3 ]

23 голосов
/ 02 июля 2010

Если вы просто хотите вызвать 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);
}
22 голосов
/ 08 марта 2010

Вам нужно libavcodec и libavformat. FAQ говорит вам:

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

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

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

6 голосов
/ 17 марта 2010

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

...