2016-08-16 19 views
0

AndroidでMediaCodecを使用すると、h264ストリームをデコードしようとしています。memdiacodecデコーダはアンドロイド5.0で動作していますが、アンドロイドでは動作しません4.4

私はcsd-0,csd-1を使用してspsppsをこのように設定します。

MediaFormat format = MediaFormat.createVideoFormat(MIME, WIDTH, HEIGHT); 
format.setByteBuffer("csd-0", sps); 
format.setByteBuffer("csd-1", pps); 

出力データをレンダリングする出力サーフェスを持つデコーダを設定します。

decoder.configure(format, surface, null, 0); 

このループを使用してネットワークから受信したデータをデコードするスレッドを開始するだけです。

while (running) { 
    if (!isEOS) { 
     int inIndex = decoder.dequeueInputBuffer(10000); 
     if (inIndex >= 0) { 
      ByteBuffer buffer = inputBuffers[inIndex]; 
      byte[] data = getVideoPacket(); // native method that get data from network 
      buffer.put(data); 

      decoder.queueInputBuffer(inIndex, 0, data.length, 0L, 0); 
     } 
    } 

    int outIndex = decoder.dequeueOutputBuffer(info, 10000); 
    switch (outIndex) { 
     case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: 
      Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED"); 
      outputBuffers = decoder.getOutputBuffers(); 
      break; 
     case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: 
      Log.d("DecodeActivity", "New format " + decoder.getOutputFormat()); 
      MediaFormat format = decoder.getOutputFormat(); 
      break; 
     case MediaCodec.INFO_TRY_AGAIN_LATER: 
      Log.d("DecodeActivity", "dequeueOutputBuffer timed out!"); 
      break; 
     default: 
      ByteBuffer buffer = outputBuffers[outIndex]; 
      Log.v("DecodeActivity", "We can't use this buffer but render it due to the API limit, " + buffer); 

      decoder.releaseOutputBuffer(outIndex, true); // render 
      break; 
    } 

    if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { 
     Log.d("DecodeActivity", "OutputBuffer BUFFER_FLAG_END_OF_STREAM"); 
     break; 
    } 
} 

私が得たデータは、ネットワークソケットからである、と私は、適切なタイムスタンプを計算する方法がわからないので、私はqueueInputBufferのpresentationTimestampため0を使用します。

私はアンドロイド5.0以上で欲しいものを手に入れましたが、アンドロイド4.4でこれらのコードを実行すると、表面に何も表示されません(実際には同じ画像の断片が時々見えますが、ただ黒です)。

私は入力バッファにファイルからフェッチされたデータ(MediaExtractorを使用)を書き込もうとしましたが、アンドロイド5.0と4.4の両方でうまく動作します。

助けていただければ幸いです。

答えて

0

問題はデータを取得する方法だと思われます。

public static native byte[] getVideoPacket(); 

とJava層へのネイティブ層から今私pushデータ:ちょうど今仕事

env->CallVoidMethod(..., data); 

すべて私は、ネイティブ層からのgetデータに使用しました。なぜか分からないけど、この方法は私のために働く。

関連する問題