吾手机进入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); }