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

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

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

Спасибо.

42
задан 8 March 2010 в 14:09
поделиться

3 ответа

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

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

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

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

24
ответ дан 26 November 2019 в 23:55
поделиться

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

7
ответ дан 26 November 2019 в 23:55
поделиться

Если вы просто хотите вызвать 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);
}
24
ответ дан 26 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: