Можно ли использовать FFmpeg в качестве библиотеки вместо автономной программы?
Я хотел бы добавить возможности преобразования видео в программу, которую я пишу. Интерфейс командной строки FFmpeg для этого просто ffmpeg -i InputFile OutputFile
, но есть ли способ использовать его как библиотеку, поэтому я могу сделать что-то вроде ffmpeg_convert(InputFile, OutputFile)
?
Я надеюсь, что мне не придется использовать libavcodec напрямую, поскольку я предполагаю, что это будет намного сложнее, чем однострочная функция для преобразования между форматами. Если FFmpeg не может быть легко модифицирован для этого, возможно, на его основе есть другая библиотека это так? Я слышал о libvlc, но это, похоже, только выставляет видео игры API, а не преобразование видео.
спасибо.
3 ответов
вам нужно libavcodec
и libavformat
. The часто задаваемые вопросы говорит:
4.1 существуют ли примеры, иллюстрирующие использование библиотек FFmpeg, в частности libavcodec и libavformat?
да. Прочитайте руководство разработчиков документации FFmpeg. Кроме того, проверьте исходный код для одного из многих проектов с открытым исходным кодом, которые уже включают FFmpeg в (проектов.HTML-код).
документация FFmpeg руководство можно найти на ffmpeg.org/documentation.html, включая руководство разработчика. Я предлагаю посмотреть на libavformat/output-example.c
или, возможно, источник ffmpeg
сама утилита командной строки.
Если вы просто хотели сделать вызов ffmpeg как функции, а не системного вызова, вы можете сделать это довольно легко.
в ffmpeg.c, change:
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++ = '';
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.
надеюсь, что это поможет...