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