9

AndroidでMediaCodecの低レベルApiを使用して、IPカメラから受信したh264生ストリームをデコードしています。TCP/IP 接続で受信する、IP カメラからの raw ストリーム。

ストリームをデコードするには、私のコードは次のとおりです。

@Override
protected void onCreate(Bundle savedInstanceState) {

 MediaCodec mCodecc;
 MediaFormat mFormat;
 BufferInfo mInfo;
 ByteBuffer[] inputBuffers ;
 ByteBuffer[] outputBuffers ;

}
protected void Init_Codec()
{
  mCodecc = MediaCodec.createDecoderByType("video/avc");
  mFormat =  MediaFormat.createVideoFormat("video/avc", width, height);

  mInfo = new BufferInfo();
mFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
  mCodecc.configure(mFormat, holder.getSurface(), null,0);
}

protected void Start_Codec()
{
  mCodecc.start();          
  inputBuffers = mCodecc.getInputBuffers();
  outputBuffers = mCodecc.getOutputBuffers();
}

private void OnRawStreamReceived(final ByteBuffer buffer)
{

 mHandler.postAtFrontOfQueue(new Runnable() {

@Override
public void run()
{
       int inIndex = mCodecc.dequeueInputBuffer(10000);
   if(inIndex>=0)
     {
    inputBuffers[inIndex] = buffer;
    mCodecc.queueInputBuffer(inIndex, 0,buffer.limit(),System.currentTimeMillis(), 0);
    }
       int outIndex = mCodecc.dequeueOutputBuffer(mInfo, 10000);
       switch (outIndex) {

    case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
    Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED");
    outputBuffers = mCodecc.getOutputBuffers();
    break;

    case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
    Log.d("DecodeActivity", "New format " + mCodecc.getOutputFormat());
    break;

        case MediaCodec.INFO_TRY_AGAIN_LATER:
    Log.d("DecodeActivity", "dequeueOutputBuffer timed out! --- size : " + mInfo.size );
    break;

    default:
    ByteBuffer buffer = outputBuffers[outIndex];

            mCodecc.releaseOutputBuffer(outIndex, true);
    break;
    }
}


int outIndex = mCodecc.dequeueOutputBuffer(mInfo, 10000);

しかし、このコード行では、常に「-1」を受け取ります。mInfo.size() も「0」になっています。与えられた表面に何も表示されていません。

どのステップが欠けていますか。私を導いてください。ありがとう

4

1 に答える 1

6

個々の「アクセス ユニット」、つまりバッファごとに 1 フレームのビデオを渡していると仮定しています。

MediaFormat不足しているように見えるのは、送信された最初のバッファーにあると予想されるコーデックセットアップブロックです ( viaに押し込むこともできますformat.setByteBuffer("csd-0", ...))。データが特定のエンコーダーから送信されていると仮定すると、BUFFER_FLAG_CODEC_CONFIGフラグを使用して最初のバッファーをキューに入れるだけです。

于 2013-04-03T20:58:38.133 に答える