FFmpeg peut être utilisé comme une bibliothèque, au lieu d'un programme autonome?
-
18-09-2019 - |
Question
Je voudrais ajouter des fonctionnalités de conversion vidéo à un programme que je vous écris. L'interface de ligne de commande de FFmpeg pour ce faire est tout simplement ffmpeg -i InputFile OutputFile
, mais est-il un moyen d'utiliser comme une bibliothèque, donc je peux faire quelque chose comme ffmpeg_convert(InputFile, OutputFile)
?
J'espère que je ne vais pas avoir à utiliser libavcodec directement, comme je l'imagine que ce sera beaucoup plus complexe qu'une fonction d'une ligne pour convertir entre les formats. Si FFmpeg ne peut pas être facilement adapté pour ce faire, il est peut-être une autre bibliothèque en fonction de ce qui fait? Je l'ai entendu parler de libvlc, mais cela semble exposer seulement une vidéo jouer API, pas de conversion vidéo.
Merci.
La solution
Vous avez besoin libavcodec
et libavformat
. vous dit:
4.1 Y at-il des exemples illustrant comment utiliser les bibliothèques FFmpeg, en particulier libavcodec et libavformat?
Oui. Lisez le Guide du développeur de la documentation FFmpeg. Vous pouvez également examiner le code source pour l'un des nombreux projets open source qui intègrent déjà FFmpeg à ( projects.html ).
Le guide de documentation FFmpeg est disponible à ffmpeg.org/documentation.html , y compris le Guide du développeur . Je suggère regarder libavformat/output-example.c
ou peut-être la source de l'utilitaire de ligne de commande ffmpeg
lui-même.
Autres conseils
Si vous voulez juste faire un appel à ffmpeg en fonction plutôt qu'un appel système, vous pouvez le faire assez facilement.
ffmpeg.c, changement:
int main(int argc, char **argv) to int ffmpeg((int argc, char **argv)
Ensuite, dans votre appel, la fonction ffmpeg et passer dans un tableau qui imite la ligne de commande. Pour le rendre encore plus facile d'utiliser une fonction pour créer l'ARGC, les variables 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);
}
Oui, vous devez utiliser libavcodec et libavformat. Je pense que vous devriez lire ffplay.c à l'intérieur du code source ffmpeg. Je pense que ce serait plus facile pour vous de commencer avec ce fichier.