Android mediadecodec到SurfaceTexture:onDrawFrame如何知道outputBufferId
我使用表面纹理作为Android mediadecodec到SurfaceTexture:onDrawFrame如何知道outputBufferId,android,android-mediacodec,Android,Android Mediacodec,我使用表面纹理作为mediacodec的输出,请参阅下面的一些日志,2个问题: mediacodec多次发布,为什么onFrameAvailable和onDrawFrame只能调用一次 通过调用onDrawFrame中的mSTexture.UpdateMaximage(),mSTexture将由之前发布的许多mediacodec输出缓冲区中的一个进行更新,但我想知道更新后的mSTexture对应的outputBufferId,我能得到吗 SurfacetTexture具有函数getTimesta
mediacodec
的输出,请参阅下面的一些日志,2个问题:
mediacodec
多次发布,为什么onFrameAvailable和onDrawFrame只能调用一次onDrawFrame
中的mSTexture.UpdateMaximage()
,mSTexture
将由之前发布的许多mediacodec
输出缓冲区中的一个进行更新,但我想知道更新后的mSTexture
对应的outputBufferId
,我能得到吗public void onDrawFrame(GL10胶接){
Log.e(标签“onDrawFrame”);
已同步(此){
如果(mUpdateST){
mUpdateST=false;
mSTexture.UpdateMaximage();//这里,我想获取更新后的mSTexture的相应outputBufferId
}
}
public void onFrameAvailable(表面纹理表面纹理){
Log.e(标签“onFrameAvailable”);
已同步(此){
mUpdateST=true;
}
}
public void onOutputBufferAvailable(MediaCodec mc、int-outputBufferId、BufferInfo-bufInfo){
Log.e(标记“OutputBufferAvailable”+outputBufferId);
解码器.releaseOutputBuffer(outputBufferId,true);
}
E/--main活动-(19589):输出缓冲区可用15
E/--main活动-(19589):输出缓冲区可用14
E/--main活动-(19589):输出缓冲区可用13
E/--main活动-(19589):输出缓冲区可用12
E/--main活动-(19589):输出缓冲区可用11
E/--MyGLSurfaceView-(19589):onFrameAvailable
E/--main活动-(19589):输出缓冲区可用10
E/--main活动-(19589):输出缓冲区可用9
E/--main活动-(19589):输出缓冲区可用8
E/--MyGLSurfaceView-(19589):onDrawFrameSurfaceTexture在“异步”模式下运行。因为生产者和消费者端可以在同一个过程中,这有助于避免死锁。这的实际效果是,如果输入速度过快,SurfaceTexture将丢弃帧 如果查看中的
awaitNewImage()
,可以看到解码器和SurfaceTexture处理程序如何协调以串行方式处理帧
理想情况下,源材料的表示时间戳将传播到SurfaceTexture的时间戳。您从
decoder.dequeueOutputBuffer()获得的BufferInfo
是否有非零时间戳?是否会降低新图像的解码速度?目前似乎只有10fps提取mpegframestest的性能瓶颈是bmp.compress(Bitmap.CompressFormat.PNG…)
。删除压缩和磁盘写入,它应该会运行得更快。当然,现在它没有做任何有用的事情。。。