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