我遇到的问题类似于此处提出的问题/答案:https://stackoverflow.com/a/22461014。但是,区别在于我正在尝试从UnityMain线程(Unity的主循环)进行解码。从Update()调用,我将一个字节数组和一个textureId传递给MediaCodec的解码器。
public void decodeFrameToTexture(BytePointer pixels, int len, int textureID) {
if ( this.textureID != textureID) {
Log.d(TAG, "TextureID changed: " + textureID);
this.textureID = textureID;
SurfaceTexture surfaceTexture = new SurfaceTexture(textureID);
mSurface = new Surface(surfaceTexture);
outputSurface = new CodecOutputSurface(width, height, textureID);
}
...然后我们进行解码(基本上是http://bigflake.com/mediacodec/ExtractMpegFramesTest.java.txt但没有while循环的代码副本,因为这是逐帧的。还复制了CodecOutputSurface和支持类,基本上是逐字的)。
最后我们有了这段代码:
decoder.releaseOutputBuffer(decoderStatus, info.size != 0 && outputSurface != null /*render*/);
if ( outputSurface != null ) {
outputSurface.awaitNewImage();
outputSurface.drawImage(true);
}
问题是,awaitNewImage()总是在没有得到帧的情况下超时,导致回到引用问题here的问题,即onFrameAvailable()回调永远不会被调用。
作为参考,UnityMain没有Looper组件。运行此代码时:
Looper looper;
if ((looper = Looper.myLooper()) != null) {
mEventHandler = new EventHandler(looper);
} else if ((looper = Looper.getMainLooper()) != null) {
mEventHandler = new EventHandler(looper);
} else {
mEventHandler = null;
}
来自该线程的指定looper是MainLooper looper。任何想法,将不胜感激。正如@fadden所说,“诀窍是确保框架可用事件到达与awaitNewImage()中的一个不同的线程”。鉴于我们正在运行
mSurfaceTexture.setOnFrameAvailableListener(this);
来自UnityMain,我认为这满足了这个要求吗?应该从“主”线程调用回调 吗?