Можно ли использовать FFmpeg как библиотеку, а не как отдельную программу?

StackOverflow https://stackoverflow.com/questions/2401764

Вопрос

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

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

Спасибо.

Это было полезно?

Решение

Вам нужно libavcodec и libavformatВопросы и ответы говорит тебе:

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top