FFmpeg puede ser utilizado como una biblioteca, en lugar de un programa independiente?
-
18-09-2019 - |
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.
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.