web-dev-qa-db-fra.com

FFmpeg peut-il être utilisé comme bibliothèque, au lieu d'un programme autonome?

Je voudrais ajouter des capacités de conversion vidéo à un programme que j'écris. L'interface de ligne de commande de FFmpeg pour ce faire est simplement ffmpeg -i InputFile OutputFile, Mais existe-t-il un moyen de l'utiliser comme bibliothèque, donc je peux faire quelque chose comme ffmpeg_convert(InputFile, OutputFile)?

J'espère que je n'aurai pas à utiliser directement libavcodec, car j'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 mis à niveau pour ce faire, existe-t-il peut-être une autre bibliothèque basée sur celle-ci? J'ai entendu parler de libvlc, mais cela ne semble exposer qu'une vidéo lecture API, pas la conversion vidéo.

Merci.

42
user123003

Vous avez besoin de libavcodec et libavformat. La FAQ vous indique:

4.1 Existe-t-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 de l'un des nombreux projets open source qui incorporent déjà FFmpeg à ( projects.html ).

Le guide de documentation de FFmpeg se trouve sur ffmpeg.org/documentation.html , y compris Guide du développeur . Je suggère de regarder libavformat/output-example.c ou peut-être la source de l'utilitaire de ligne de commande ffmpeg lui-même.

24
Christoph

Si vous souhaitez simplement appeler ffmpeg en tant que fonction plutôt qu'en tant qu'appel système, vous pouvez le faire assez facilement.

dans ffmpeg.c, modifiez:

int main(int argc, char **argv) to int ffmpeg((int argc, char **argv)

Ensuite, dans votre appel, la fonction ffmpeg et passez dans un tableau qui imite la ligne de commande. Pour le rendre encore plus facile, utilisez une fonction pour créer les variables 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);
}
25
Terrence

Oui, vous devez utiliser libavcodec et libavformat. Je pense que vous devriez lire sur ffplay.c dans le code source de ffmpeg. Je pense qu'il serait plus facile pour vous de commencer avec ce fichier.

7
deddihp