全网首发:为什么解码器长时间没有画面?如何解决?

  吾手机进入FreeSwitch,经常长时间没有画面。吾于是经常频繁退出、进入,试图出现画面。很难出现。

  今天在外面爬山时,然后想起这事。之所以没画面,跟关键帧有关。之前为了解决终端互通问题,吾使用了一个多次发关键帧的办法。那么进会议室能不能如此呢?

  • 会议室多次发关键帧。这个改起来比较麻烦。
  • 终端收到关键帧再干活。这个比较方便。

  吾首先在终端这边进行了处理,效果非常好。进入会议室后,终端的画面马上就解码成功。代码大家可以参考一下:

	private Surface videoSurface;

    private AndroidVideoDecoder videoDecoder;
    private MediaCodecData mInputData;
    private MediaCodecData mOutputData;
    private byte[] dataBuffer;
    private byte[] dataBufferKeyFrame;


    private void decodeData(final byte[] data, final int dataSize)
    {
        mInputData.setData(data, dataSize);

        int result = videoDecoder.process(mInputData, mOutputData);
        if (result != -1)
        {
            mWidth = videoDecoder.getWidth();
            mHeight= videoDecoder.getHeight();
        }
    }

    private void onDataReceived(final byte[] dataBuffer, final int dataSize)
    {
        if ((dataBuffer[4]&0x1F) == 0x07)
        {
            if (videoSurface == null)
            {
                dataBufferKeyFrame = new byte[dataSize];
                System.arraycopy(dataBuffer, 0, dataBufferKeyFrame, 0, dataSize);
                return;
            }
        }
        else
        {
            if (videoDecoder == null)
            {
                return;
            }
        }

            
        if (videoDecoder == null)
        {
            videoDecoder = new AndroidVideoDecoder(videoSurface, mWidth, mHeight);
            mInputData   = new MediaCodecData(mWidth, mHeight);
            mOutputData  = new MediaCodecData(mWidth, mHeight);
            if (dataBufferKeyFrame != null)
            {
                decodeData(dataBufferKeyFrame, dataBufferKeyFrame.length);
                dataBufferKeyFrame = null;
            }
        }
        decodeData(dataBuffer, dataSize);
    }

猜你喜欢

转载自blog.csdn.net/quantum7/article/details/107447722