Pergunta

Eu gostaria de adicionar capacidades de conversão de vídeo para um programa que eu estou escrevendo. interface de linha de comando do FFmpeg para fazer isso é simplesmente ffmpeg -i InputFile OutputFile, mas existe uma maneira de fazer uso dele como uma biblioteca, para que eu possa fazer algo como ffmpeg_convert(InputFile, OutputFile)?

Eu estou esperando que eu não terá que usar libavcodec diretamente, como eu imagino que vai ser muito mais complexo do que uma função de uma linha para converter entre formatos. Se FFmpeg não podem ser facilmente adaptados para fazer isso, há talvez uma outra biblioteca com base nele que faz? Já ouvi falar de libvlc, mas que parece expor apenas uma vídeo jogando API, não a conversão de vídeo.

Graças.

Foi útil?

Solução

Você precisa libavcodec e libavformat. A FAQ lhe diz:

4.1 Existem exemplos que ilustram como usar as bibliotecas FFmpeg, particularmente libavcodec e libavformat?

Sim. Leia o Guia de Desenvolvedores da documentação FFmpeg. Como alternativa, examinar o código-fonte de um dos muitos projetos de código aberto que já incorporam FFmpeg em ( projects.html ).

O guia documentação FFmpeg podem ser encontradas em ffmpeg.org/documentation.html , incluindo o guia do desenvolvedor . Sugiro olhando para libavformat/output-example.c ou talvez a fonte do ffmpeg próprio utilitário de linha de comando.

Outras dicas

Se você só queria fazer uma chamada para ffmpeg como função em vez de uma chamada de sistema, você pode fazer isso muito facilmente.

em ffmpeg.c, alteração:

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

Então, em sua chamada a função ffmpeg e passar em uma matriz que imita a linha de comando. Para tornar ainda mais fácil usar uma função para criar o argc, argv variáveis.

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

Sim, você tem que usar libavcodec e libavformat. Eu acho que você deve ler sobre ffplay.c dentro do código fonte ffmpeg. Eu acho que seria mais fácil para você começar com esse arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top