mediadecodec到SurfaceTexture:onDrawFrame如何知道outputBufferId

时间:2016-06-17 03:12:58

标签: android mediacodec

我使用表面纹理作为mediacodec的输出,请参阅下面的一些日志,2个问题:

  1. mediacodec多次发布,为什么onFrameAvailable和onDrawFrame只能被调用一次?
  2. 通过调用mSTexture.updateTexImage()中的onDrawFramemSTexture将会被之前发布的许多mediacodec输出缓冲区中的一个更新,但我想知道相应的outputBufferId更新后的mSTexture,我可以得到吗?
  3. SurfaceTexture有函数getTimestamp和getTransformMatrix,不确定这是否有帮助,为什么getTimestamp总是返回0?

    public void onDrawFrame(GL10 glUnused) { Log.e(TAG, "onDrawFrame"); synchronized (this) { if (mUpdateST) { mUpdateST = false; mSTexture.updateTexImage(); // Here, I want to get the corresponding outputBufferId of the updated mSTexture } }

    public void onFrameAvailable(SurfaceTexture surfaceTexture) { Log.e(TAG, "onFrameAvailable"); synchronized(this) { mUpdateST = true; } }

    public void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, BufferInfo bufInfo) { Log.e(TAG, "OutputBufferAvailable " + outputBufferId); decoder.releaseOutputBuffer(outputBufferId, true); }

    E / --- MainActivity - (19589):OutputBufferAvailable 15

    E / --- MainActivity - (19589):OutputBufferAvailable 14

    E / --- MainActivity - (19589):OutputBufferAvailable 13

    E / --- MainActivity - (19589):OutputBufferAvailable 12

    E / --- MainActivity - (19589):OutputBufferAvailable 11

    E / --- MyGLSurfaceView - (19589):onFrameAvailable

    E / --- MainActivity - (19589):OutputBufferAvailable 10

    E / --- MainActivity - (19589):OutputBufferAvailable 9

    E / --- MainActivity - (19589):OutputBufferAvailable 8

    E / --- MyGLSurfaceView - (19589):onDrawFrame

1 个答案:

答案 0 :(得分:2)

SurfaceTexture在"异步"中运行模式。因为生产者和消费者端可以在同一个进程中,所以这对于避免死锁很有用。这样做的实际效果是,如果你喂它太快,SurfaceTexture会丢帧。

如果查看ExtractMpegFramesTest中的awaitNewImage(),您可以看到解码器和SurfaceTexture处理程序如何协调以串行方式处理帧。

理想情况下,源材质的显示时间戳会传播到SurfaceTexture的时间戳。您从decoder.dequeueOutputBuffer()获得的BufferInfo是否具有非零时间戳?