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
    ,我能得到吗
  • SurfacetTexture具有函数getTimestamp和GetTransferormMatrix,不确定这是否有帮助,为什么getTimestamp总是返回0

    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):onDrawFrame

    SurfaceTexture在“异步”模式下运行。因为生产者和消费者端可以在同一个过程中,这有助于避免死锁。这的实际效果是,如果输入速度过快,SurfaceTexture将丢弃帧

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


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

    是否会降低新图像的解码速度?目前似乎只有10fps提取mpegframestest的性能瓶颈是
    bmp.compress(Bitmap.CompressFormat.PNG…)
    。删除压缩和磁盘写入,它应该会运行得更快。当然,现在它没有做任何有用的事情。。。