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