Можно ли использовать FFmpeg в качестве библиотеки вместо отдельной программы?
Я хотел бы добавить возможности преобразования видео в программу, которую я пишу. Интерфейс командной строки FFmpeg для этого просто ffmpeg -i InputFile OutputFile
, но есть ли способ использовать его в качестве библиотеки, поэтому я могу сделать что-то вроде ffmpeg_convert(InputFile, OutputFile)
?
Я надеюсь, что мне не придется напрямую использовать libavcodec, так как я представляю, что это будет намного сложнее, чем однострочная функция для преобразования между форматами. Если FFmpeg не может быть легко модернизирован, чтобы сделать это, возможно, есть другая библиотека, основанная на этом, которая делает? Я слышал о libvlc, но, похоже, он предоставляет только API для воспроизведения видео, а не для конвертации видео.
Благодарю.
3 ответа
Тебе нужно libavcodec
а также libavformat
, FAQ говорит вам:
4.1 Существуют ли примеры, иллюстрирующие, как использовать библиотеки FFmpeg, в частности libavcodec и libavformat?
Да. Прочитайте Руководство по разработке документации FFmpeg. В качестве альтернативы, изучите исходный код одного из многих проектов с открытым исходным кодом, которые уже включают FFmpeg в ( http://ffmpeg.org/projects.html).
Руководство по документации FFmpeg можно найти по адресу http://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. Я думаю, вам будет легче начать с этого файла. Во всяком случае, я сделал несколько приложений с использованием этой библиотеки, проверить это на rtstegvideo.sourceforge.net.
Надеюсь, это поможет...