0

コンテキスト: libffmpeg.so という名前のファイルがあります。これはAPKAndroid複数FFMPEGCodecs. したがって、これはエンコーディング オプションを有効にしてコンパイルされ、この .so ファイルにはすべてのコーデックがどこかに含まれていることを当然のことと考えています。このファイルはコンパイルされています(プロファイルARMと呼ばれるもの)。ARMEABIAndroid

APIから呼び出す相互運用機能を備えた非常に完全なクラスもありますffmpeg。この の起源が何であれstatic library、すべての通話応答は良好で、ほとんどのエンドポイントが存在します。そうでない場合は、それらを追加するか、非推奨のものを修正します。

を作成したい場合ffmpeg Encoder、返されたエンコーダは正しいです。

var thisIsSuccessful = avcodec_find_encoder(myAVCodec.id);

今、私はに問題がありCodecsます。問題は、好奇心から言ってみましょう - すべてのコーデックのリストを反復処理して、 avcodec_open 呼び出しで開くことができるコーデックを確認することです...

        AVCodec codec;

        var res = FFmpeg.av_codec_next(&codec);
        while((res = FFmpeg.av_codec_next(res)) != null)
        {
            var name = res->longname;


            AVCodec* encoder = FFmpeg.avcodec_find_encoder(res->id);
            if (encoder != null) {
                AVCodecContext c = new AVCodecContext ();       

                /* put sample parameters */
                c.bit_rate = 64000;
                c.sample_rate = 22050;
                c.channels = 1;

                if (FFmpeg.avcodec_open (ref c, encoder) >= 0) {
                    System.Diagnostics.Debug.WriteLine ("[YES] - " + name);
                }
            } else {
                System.Diagnostics.Debug.WriteLine ("[NO ] - " + name);
            }
        }

...その後、圧縮されていないコーデックのみが機能しています。(YUV、FFmpeg ビデオ 1 など)

私の仮説は次のとおりです。

  • .so ファイルへのコンパイル時に欠落していたオプション
  • av_open_codec 呼び出しは、呼び出しで参照した AVCodecContext のプロパティに応じて動作します。

非圧縮コーデックの最小限のセットのみが返されるのはなぜですか?

[編集]

@ronald-s-bultjeの回答により、AVCodecContext APIの説明を読むようになりました。エンコーダーで使用する場合、「ユーザーが設定する必要があります」という必須フィールドがたくさんあります。これらのパラメータに値を設定するAVCodecContextと、ほとんどのナイス コーデックが利用可能になります。

c.time_base = new AVRational (); // Output framerate. Here, 30fps
c.time_base.num = 1;
c.time_base.den = 30;
c.me_method = 1; // Motion-estimation mode on compression -> 1 is none
c.width = 640; // Source width
c.height = 480; // Source height
c.gop_size = 30; // Used by h264. Just here for test purposes.
c.bit_rate = c.width * c.height * 4; // Randomly set to that...
c.pix_fmt = FFmpegSharp.Interop.Util.PixelFormat.PIX_FMT_YUV420P; // Source pixel format
4

1 に答える 1