我使用表面纹理作为mediacodec
的输出,请参阅下面的一些日志,2个问题:
mediacodec
多次发布,为什么onFrameAvailable和onDrawFrame只能被调用一次?mSTexture.updateTexImage()
中的onDrawFrame
,mSTexture
将会被之前发布的许多mediacodec
输出缓冲区中的一个更新,但我想知道相应的outputBufferId
更新后的mSTexture
,我可以得到吗?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
答案 0 :(得分:2)
SurfaceTexture在"异步"中运行模式。因为生产者和消费者端可以在同一个进程中,所以这对于避免死锁很有用。这样做的实际效果是,如果你喂它太快,SurfaceTexture会丢帧。
如果查看ExtractMpegFramesTest中的awaitNewImage()
,您可以看到解码器和SurfaceTexture处理程序如何协调以串行方式处理帧。
理想情况下,源材质的显示时间戳会传播到SurfaceTexture的时间戳。您从decoder.dequeueOutputBuffer()
获得的BufferInfo是否具有非零时间戳?