Pregunta

Me gustaría añadir capacidades de conversión de vídeo a un programa que estoy escribiendo. interfaz de línea de comandos de FFmpeg para hacer esto es simplemente ffmpeg -i InputFile OutputFile, pero hay una manera de hacer uso de ella como una biblioteca, por lo que se puede hacer algo como ffmpeg_convert(InputFile, OutputFile)?

Espero que no voy a tener que usar libavcodec directamente, ya que me imagino que será mucho más complejo que una función de una línea para convertir entre formatos. Si FFmpeg no se puede adaptar fácilmente para hacer esto, ¿hay quizá otra biblioteca basado en él que hace? He oído hablar de libvlc, pero que parece sólo para exponer un vídeo jugando API, no de conversión de vídeo.

Gracias.

¿Fue útil?

Solución

Es necesario libavcodec y libavformat. El FAQ le dice:

  

4.1 ¿Hay ejemplos que ilustran cómo utilizar las bibliotecas FFmpeg, particularmente libavcodec y libavformat?

     

Sí. Lea la Guía de Desarrolladores de la documentación FFmpeg. Por otra parte, examinar el código fuente de uno de los muchos proyectos de código abierto que ya incorporan en FFmpeg ( projects.html ).

La guía documentación FFmpeg se puede encontrar en ffmpeg.org/documentation.html , incluyendo el guía del desarrollador . Sugiero mirar libavformat/output-example.c o tal vez la fuente de la ffmpeg utilidad de línea de comandos.

Otros consejos

Si sólo quería hacer una llamada a ffmpeg como función en lugar de una llamada al sistema, se puede hacer eso con bastante facilidad.

en ffmpeg.c, cambie:

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

Luego, en su llamada a la función ffmpeg y pasar de una matriz que imita la línea de comandos. Para hacer aún más fácil utilizar una función para crear el argc, argv las variables.

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);
}

Si usted tiene que utilizar libavcodec y libavformat. Creo que deberías leer sobre ffplay.c dentro del código fuente de FFmpeg. Creo que sería más fácil para que usted comience con ese archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top