2010-03-08 3 views
33

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

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

Спасибо.

+0

Просто из любопытства, почему вы предпочитаете использовать его как DLL? Каков недостаток exec() в нем? –

+0

Я бы не хотел запускать его в отдельном процессе, потому что AFAIK у меня не было бы возможности контролировать его прогресс или запускать функцию после ее завершения. – 2010-03-08 14:19:35

+1

IMHO работает 'ffmpeg' в отдельном процессе, это лучшая идея, поэтому ваше приложение не застрянет, пока идет длительный процесс кодирования видео. –

ответ

19

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

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

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

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

+0

это работало над ANDroid Lollipop? –

5

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

Надеется, что это поможет ...

22

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

Вместо того, чтобы изменять его, просто вызовите компилятор с помощью '-Dmain = ffmpeg'. –

 Смежные вопросы

  • Нет связанных вопросов^_^