使用Android的低级API解码H264流 [英] Decoding H264 streaming using android low level api

查看:748
本文介绍了使用Android的低级API解码H264流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Android的媒体codeC底层API脱code H264原料流从IP摄像机接收。 从IP相机原始数据流,接收的TCP / IP连接。

I am using MediaCodec low level Api in android to decode h264 raw stream received from IP CAMERA. Raw stream from IP camera , receiving on TCP/IP connection.

要取消code流,我的code是:

To decode stream , My code is :

@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);

但在这行code,我总是收到-1。和mInfo.size()也是我得到0。和它不给定表面上显示什么。

But at this line of code , I'm always receiving "-1". and mInfo.size() is also I'm getting "0". and It is not displaying anything on given surface.

这一步,我很想念。请指导我。 感谢名单

Which step I'm missing. please guide me. thanx

推荐答案

我假设你传递的个人访问单元,每个缓冲区的视频,即一帧。

I'm assuming you're passing in individual "access units", i.e. one frame of video per buffer.

什么,你似乎缺少的是codeC设置模块,预计将在提交第一个缓冲区(也可以塞进 MediaFormat 通过 format.setByteBuffer(CSD-0,...))。假设数据出来你的特殊的连接codeR,所有你需要做的是队列中第一个与<缓冲href="http://developer.android.com/reference/android/media/Media$c$cc.html#BUFFER_FLAG_$c$cC_CONFIG">BUFFER_FLAG_$c$cC_CONFIG标志。

What you seem to be missing is the codec setup block, which is expected to be in the first buffer submitted (could also be tucked into the MediaFormat via format.setByteBuffer("csd-0", ...)). Assuming that data is coming out of your particular encoder, all you have to do is queue the first buffer with the BUFFER_FLAG_CODEC_CONFIG flag.

这篇关于使用Android的低级API解码H264流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆