从Unity3d解码Android MediaCodec失败

时间:2015-03-23 22:33:28

标签: java android mediacodec

我遇到的问题类似于此处提出的问题/答案: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,我认为这满足了这个要求吗?应该从“主”线程调用回调 吗?

0 个答案:

没有答案