私は、無人機のモバイルアプリで、無人機のカメラビューのリアルタイムの視覚化を指向しています(特に、DJI Phantom 3 Professional相対SDKで)。 ARフレームワークのカメラストリームを外部ビデオストリームに置き換える方法を学ぶために、私はDJIデモ「ビデオストリームデコードサンプル」(https://developer.dji.com/mobile-sdk/documentation/sample-code/index.html)を試しています。DJI「ビデオストリームのデコードサンプル」:ヌルサーフェイスの問題で設定されたMediaCodec
特に、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);
}
今私の問題は、最初の場合(表面とはMediaCodecにセット)しながら、私は30のフレームの平均フレームレートを数えることができる、ということですこの場合(Surfaceがnullに設定されている場合)、平均フレームレートは約15-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):FILE:DJIVideoStreamDecoder.java ;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 1 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.112 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder; METODO:decodeFrame() - 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder。Java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder;メソッド:decodeFrame() - 6 02-05 21:42:58.122 I/DJIVideoStreamDecoder(27992):FILE:DJIVideoStreamDecoder.java;クラス:DJIVideoStreamDecoder; METODO:decodeFrame() - ログファイルが示すように6
、しばしばdequeueInputBuffer()は負inIndex値を返し、入力バッファ使用できないため、いくつかのフレームは、コーデックに入力することができない。このフレームの約半分だけが正しくデコードされることになる。 この問題は、サーフェスがnullの場合にのみ観察されます。どうしましたか?これについていくつかアドバイスをお願いします。