Android MediaCodec缓冲区不可用

Android MediaCodec缓冲区不可用,android,opengl-es,android-mediacodec,Android,Opengl Es,Android Mediacodec,我试图通过使用OpenGL SurfaceView录制mp4,并使用MediaCodec编码器在一个线程中对视频帧进行编码,在另一个线程中,我使用AudioRecord录制音频样本,使用单独的编码器对音频数据进行编码,最后使用MediaMuxer进行实际的多路复用 在一些设备上(大多数是高端设备),我使用的方法工作得非常好,输出视频应该没有错误或类似的东西。但是,在其他一些设备上,情况并非如此 在某些设备上(即Moto Droid Turbo 2),音频编码器(在其自己的线程中运行)将处理一些音

我试图通过使用OpenGL SurfaceView录制mp4,并使用MediaCodec编码器在一个线程中对视频帧进行编码,在另一个线程中,我使用AudioRecord录制音频样本,使用单独的编码器对音频数据进行编码,最后使用MediaMuxer进行实际的多路复用

在一些设备上(大多数是高端设备),我使用的方法工作得非常好,输出视频应该没有错误或类似的东西。但是,在其他一些设备上,情况并非如此

在某些设备上(即Moto Droid Turbo 2),音频编码器(在其自己的线程中运行)将处理一些音频样本,然后在尝试将编码器的输入缓冲区出列时返回MediaCodec.INFO\u BUFFER\u UNAVAILABLE,在大约5个样本成功编码且视频编码器运行完全正常后,开始出现这种情况。但在另一台设备(即三星Galaxy Alpha)上,当视频编码器的输入缓冲区出列且音频编码器运行正常时,视频编码器开始返回MediaCodec.INFO_BUFFER_UNAVAILABLE状态

我想我的问题是,我已经到处寻找一个完全清楚的解释,缓冲区不可用的原因是什么?除了在下次使用前不释放缓冲区外,是什么原因造成的?我98%确信,当需要释放缓冲区时,我会释放缓冲区,因为我测试过的大多数设备上都会使用完全相同的代码。(Nexus 5x、Nexus 6P、三星S6、三星Edge/Edge+、Moto X(2014)、Moto X(2015)、HTC One M9、HTC One M8等)

有人有什么想法吗?我不认为发布代码示例是必要的,因为我知道它可以在我测试过的大多数设备上运行,但我的问题是,除了不释放缓冲区之外,还有什么原因会导致MediaCodec.INFO\u BUFFER\u无法返回

编辑: 进一步调查这个问题,甚至有点奇怪。我开始认为这与设备的处理能力有关,这可以解释为什么高端设备工作正常,而低端设备工作不正常。然而,三星Note Edge(工作正常)的CPU、GPU、芯片组和RAM数量与Moto Droid Turbo相同,后者在从音频编码器中清除音频缓冲区时遇到错误

编辑2: 是的,这完全是我所做的事情造成的。这个问题之所以发生,是因为我在muxer尚未启动的实例中错过了对缓冲区的释放调用。因此,在该实例中,我没有释放缓冲区,而是忽略它并移动它,从而导致缓冲区挂起。问题解决