AndroidでMediaCodecを使用すると、h264ストリームをデコードしようとしています。memdiacodecデコーダはアンドロイド5.0で動作していますが、アンドロイドでは動作しません4.4
私はcsd-0
,csd-1
を使用してsps
とpps
をこのように設定します。
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の両方でうまく動作します。
助けていただければ幸いです。