2017-02-05 10 views
-1

私は、無人機のモバイルアプリで、無人機のカメラビューのリアルタイムの視覚化を指向しています(特に、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の場合にのみ観察されます。どうしましたか?これについていくつかアドバイスをお願いします。

答えて

0

dequeueInputBufferが負の「インデックス」を返した場合、それらの値は実際にはインデックスとして解釈されるのではなく、メタデータとして解釈されることを意味します。 dequeueInputBufferについてはAndroid documentationを参照し、INFO *定数(MediaCodec.INFO_TRY_AGAIN_LATER、MediaCodec.INFO_OUTPUT_FORMAT_CHANGEDなど)を確認してください。ドキュメントページの上部には、それらを処理する方法のサンプルコードがあります。

関連する問題