web-dev-qa-db-ja.com

FFmpegをスタンドアロンプ​​ログラムの代わりにライブラリとして使用できますか?

私が書いているプログラムにビデオ変換機能を追加したいのですが。これを行うためのFFmpegのコマンドラインインターフェイスは単に_ffmpeg -i InputFile OutputFile_ですが、それをライブラリとして使用する方法があるので、ffmpeg_convert(InputFile, OutputFile)のようなことを行うことができますか?

Libavcodecを直接使用する必要がないことを願っています。これは、形式間で変換する1行の関数よりもはるかに複雑になると考えられるためです。これを行うためにFFmpegを簡単に改造できない場合、それをベースにした別のライブラリがおそらくありますか?私はlibvlcについて聞いたことがありますが、それはビデオplaying APIのみを公開し、ビデオ変換を公開しないようです。

ありがとう。

42
user123003

libavcodeclibavformatが必要です。 [〜#〜] faq [〜#〜] は次のように伝えます。

4.1 FFmpegライブラリ、特にlibavcodecとlibavformatの使用方法を示す例はありますか?

はい。 FFmpegドキュメントの開発者ガイドを読んでください。または、( projects.html )でFFmpegをすでに組み込んでいる多くのオープンソースプロジェクトの1つについてソースコードを調べます。

FFmpegドキュメントガイドは ffmpeg.org/documentation.html にあります 開発者ガイド を含みます。 libavformat/output-example.cまたはffmpegコマンドラインユーティリティ自体のソース。

24
Christoph

システムコールではなく関数としてffmpegを呼び出すだけの場合は、かなり簡単に行うことができます。

ffmpeg.cで、次のように変更します。

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

次に、ffmpeg関数を呼び出して、コマンドラインを模倣した配列を渡します。関数をさらに簡単に使用するには、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);
}
25
Terrence

はい、libavcodecとlibavformatを使用する必要があります。 ffmpegのソースコード内のffplay.cについて読むべきだと思います。そのファイルから始める方が簡単だと思います。

7
deddihp