2010-03-08 9 views
33

Vorrei aggiungere funzionalità di conversione video a un programma che sto scrivendo. L'interfaccia a riga di comando di FFmpeg per fare ciò è semplicemente ffmpeg -i InputFile OutputFile, ma c'è un modo per usarlo come libreria, quindi posso fare qualcosa come ffmpeg_convert(InputFile, OutputFile)?FFmpeg può essere usato come libreria, invece di un programma standalone?

Spero di non dover utilizzare direttamente libavcodec, poiché immagino che sarà molto più complesso di una funzione a una riga per la conversione tra i formati. Se FFmpeg non può essere facilmente riadattato per fare questo, c'è forse un'altra libreria basata su di essa che lo fa? Ho sentito parlare di libvlc, ma questo sembra esporre solo un video riproducendo l'API, non la conversione video.

Grazie.

+0

Solo per curiosità, perché preferiresti utilizzarlo come DLL? Qual è lo svantaggio di exec()? –

+0

Non vorrei eseguirlo in un processo separato, perché AFAIK I non avrebbe alcuna possibilità di monitorare i suoi progressi o eseguire una funzione al suo completamento. –

+1

L'IMHO che esegue 'ffmpeg' in un processo separato è un'idea migliore, quindi la tua applicazione non sarà bloccata durante il lungo processo di codifica video. –

risposta

19

È necessario libavcodec e libavformat.

4,1 ci sono esempi che illustrano come utilizzare le librerie FFmpeg, in particolare libavcodec e libavformat: Il FAQ ti dice?

Sì. Leggi la Guida per gli sviluppatori della documentazione di FFmpeg. In alternativa, esaminare il codice sorgente per uno dei tanti progetti open source che già incorporano FFmpeg in (projects.html).

La guida documentazione FFmpeg può essere trovato alla ffmpeg.org/documentation.html, compreso il Developer's guide. Suggerisco di guardare libavformat/output-example.c o forse la fonte dell'utilità della riga di comando ffmpeg stessa.

+0

ha funzionato su ANdroid Lollipop? –

5

Sì, è necessario utilizzare libavcodec e libavformat. Penso che dovresti leggere su ffplay.c all'interno del codice sorgente di ffmpeg. Penso che sarebbe più facile per te iniziare con quel file. Ad ogni modo, ho creato un'applicazione utilizzando questa libreria, controlla su rtstegvideo.sourceforge.net.

Spero che questo aiuto ...

22

Se si voleva solo fare una chiamata a ffmpeg come funzione piuttosto che una chiamata di sistema, si può farlo abbastanza facilmente.

in ffmpeg.c, modificare:

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

Poi nella chiamata funzione ffmpeg e passare un array che imita la linea di comando. Per rendere ancora più semplice utilizzare una funzione per creare le variabili 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

Invece di cambiarlo, basta chiamare il compilatore con '-Dmain = ffmpeg'. –

Problemi correlati