2010-03-08 22 views
33

Me gustaría agregar capacidades de conversión de video a un programa que estoy escribiendo. La interfaz de línea de comandos de FFmpeg para hacer esto es simplemente ffmpeg -i InputFile OutputFile, pero ¿hay alguna manera de usarlo como biblioteca, así que puedo hacer algo como ffmpeg_convert(InputFile, OutputFile)?¿Se puede usar FFmpeg como biblioteca, en lugar de un programa independiente?

Espero no tener que usar libavcodec directamente, ya que imagino que será mucho más complejo que una función de una sola línea para convertir formatos. Si FFmpeg no se puede actualizar fácilmente para hacer esto, ¿existe tal vez otra biblioteca basada en él que sí lo haga? He oído hablar de libvlc, pero parece que solo muestra un video jugando a API, no conversión de video.

Gracias.

+0

Sólo por curiosidad, ¿por qué prefiere usarlo como una DLL? ¿Cuál es la desventaja de ejecutarlo? –

+0

No me gustaría ejecutarlo en un proceso separado, porque AFAIK I no podría monitorear su progreso o ejecutar una función una vez que se complete. –

+1

En mi humilde opinión, ejecutar 'ffmpeg' en un proceso separado es una mejor idea, por lo que su aplicación no se bloqueará mientras dure el largo proceso de codificación de video. –

Respuesta

19

Necesita libavcodec y libavformat.

4,1 ¿Hay ejemplos que ilustran el uso de las bibliotecas FFmpeg, particularmente libavcodec y libavformat: El FAQ te dice?

Sí. Lea la guía de desarrolladores de la documentación de FFmpeg. Alternativamente, examine el código fuente de uno de los muchos proyectos de código abierto que ya incorporan FFmpeg en (projects.html).

La guía de documentación de FFmpeg se puede encontrar en ffmpeg.org/documentation.html, incluido el Developer's guide. Sugiero mirar libavformat/output-example.c o quizás la fuente de la utilidad de línea de comandos ffmpeg.

+0

¿Funcionó en ANdroid Lollipop? –

5

Sí, tiene que usar 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 ti comenzar con ese archivo. De todos modos, he hecho alguna aplicación usando esa biblioteca, échale un vistazo a rtstegvideo.sourceforge.net.

Esperanza esta ayuda ...

22

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 hacerlo aún más fácil, use una función para crear las 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); 
} 
+14

En lugar de cambiarlo, simplemente llame al compilador con '-Dmain = ffmpeg'. –

Cuestiones relacionadas