-1

私は、ドローンのカメラビューのリアルタイム拡張視覚化を目的とした Android モバイルアプリに取り組んでいます (具体的には、相対 SDK を使用して DJI Phantom 3 Professional に取り組んでいます)。AR フレームワークのカメラ ストリームを外部ビデオ ストリームに置き換える方法を検討するために、DJI デモ「ビデオ ストリーム デコーディング サンプル」( https://developer.dji.com/mobile-sdk/documentation/サンプルコード/index.html )。

具体的には、configure() メソッドで Surface パラメーターを null に設定するだけで、MediaCodec から生のビデオ データを取得しようとしています。そのため、MediaCodec にビデオ ストリームをレンダリングさせる必要はありませんが、onYuvDataReceived() メソッドを使用してすべての出力 YUV フレームをリダイレクトしたいと考えています。そこで、MainActivity.java で次の 2 つのコード行を変更しました。

@Override
            public void surfaceCreated(SurfaceHolder holder) {

                DJIVideoStreamDecoder.getInstance().setYuvDataListener(MainActivity.this);
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

                DJIVideoStreamDecoder.getInstance().changeSurface(null);
            }

ここで私の問題は、最初のケース (Surface が MediaCodec に設定されている) では平均フレームレートが毎秒 30 フレームとカウントできるのに対し、この場合 (Surface が null に設定されている) は平均フレームレートが約 15 であることです。 1 秒あたり 16 のデコードされたフレーム (これは、ビデオ レンダリングの品質に大きな影響を与える可能性があります!)。特に、デバッグを通じて、問題が次のセクションにあることがわかりました。

        for (int i = 0; i < CODEC_DEQUEUE_INPUT_QUEUE_RETRY && inIndex < 0; i ++) {
        //Log.i(TAGa,"FILE: DJIVideoStreamDecoder.java; CLASS: DJIVideoStreamDecoder; METODO: decodeFrame() -- 5");    //DEBUG
        try {
            Log.i(TAGa,"FILE: DJIVideoStreamDecoder.java; CLASS: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6");    //DEBUG

            inIndex = codec.dequeueInputBuffer(0);
        } catch (IllegalStateException e) {
            Log.i(TAGa,"FILE: DJIVideoStreamDecoder.java; CLASS: DJIVideoStreamDecoder; METODO: decodeFrame() -- 7");    //DEBUG

            logd(TAGa, "decodeFrame: dequeue input: " + e);
            codec.stop();
            codec.reset();
            initCodec();
            e.printStackTrace();
        }
    }

ログ ファイル: 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 1 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; 方法: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス:DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; METODO: decodeFrame() -- 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992): ファイル: DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; 方法:decodeFrame() -- 6 DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; 方法:decodeFrame() -- 6 DJIVideoStreamDecoder.java; クラス: DJIVideoStreamDecoder; 方法:decodeFrame() -- 6

ログ ファイルが示すように、多くの場合、dequeueInputBuffer() は負の inIndex 値を返し、一部のフレームはコーデックに入力できません。これは、入力バッファーが使用できないためです。これにより、フレームの約半分のみが正しくデコードされます。この問題は、サーフェスが null の場合にのみ観察されます! どうしたの?これについて何かアドバイスをください。

4

1 に答える 1