MediaCodec使用连接RTSP服务器拍照大小只有128kb大小问题

来源:互联网 发布:社交数据库设计 编辑:程序博客网 时间:2024/05/14 21:36

MediaCodec是Android提供的标准编解码API,由于之前接触流媒体这块不多,项目需要,查了一个MediaCodec关于的使用方式,之后后开始用起来。项目场景是这样子的,使用手机连接全景相机rtsp采集时时流数据,客户端使用VCL接受数据,同时手机端可以通过app可以开启、关闭流播、拍照、录像等操作,由于拍照的图片所需要的质量要求比较高,需要4k或者是更高的6K,故不能采用采用时时里面的数据帧来保存为图片,而项目需要必须要求时时打开流播,这就涉及到必须拍照或者是录像的同时必须先今掉流播,再启动拍照或者是录像。

在流播的时候,开启一个生产线程不断的生产数据,从Camera里面得到数据,再把得到的数据传送给底层opengl渲染,时时拼接,再把编码过后的ByteBuffer传送给live555,

点击拍照,然后再开启流播会发现一个很奇怪的问题,最开始切换成功以后,拍照都成功,后面拍照4k大小只有128kb,百思不得奇解。最后通过分析,原来是使用MediaCodec没有释放索引缓冲区。

找到问题的原因呢,当然会有解决办法,我的解决办法是开启一个消费线程,代码如下;

private Runnable VideoMuxerRunnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
ESLog.d(TAG, "video muxer thread runnable start");
// if(mInit){
setVideoMuxerRunning(true);
ESLog.d(TAG, " VideoMuxerRunnable start ");
int bufferIndex = -1; 
BufferInfo mBufferInfo = new BufferInfo();
ByteBuffer[] mByteBufferArray = mediaCodec.getOutputBuffers();
ByteBuffer mBuffer = null;
            ESLog.d(TAG, "mVideoMuxerRunning>>>>>>>>"+getVideoMuxerRunning());
while (getVideoMuxerRunning() && dataComing) {
                //开启流播后,这里的视频生产线程没有起来
bufferIndex = mediaCodec.dequeueOutputBuffer(mBufferInfo,
1000000);// wait 1 seconds,not real wait time
if (bufferIndex >= 0) {
mBuffer = mByteBufferArray[bufferIndex];
mBuffer.position(0);
mediaCodec.releaseOutputBuffer(bufferIndex, false);
// FileLoger.LOGE(TAG, "media code release buffer");
} else if (bufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
mByteBufferArray = mediaCodec.getOutputBuffers();
} else if (bufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
// mVideoMediaFormat = mMediaCodec.getOutputFormat();
// MediaFormatComing(mediaCodec.getOutputFormat(), TYPE_VIDEO);
} else if (bufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) {
// delay
ESLog.d(TAG, "INFO_TRY_AGAIN_LATER");
FileLoger.LOGE(TAG, "media code release buffer");
} else {
ESLog.d(TAG, "unknow bufferindex:" + bufferIndex);
}
}
// }
}
};

释放一下缓冲区就可以了

0 0
原创粉丝点击