前一段时间在做视频接收的时候,自己写了一个很简单的环形缓冲区例子,参照了ffmpeg AVFifoBuffer类,但是又简化了这个类,并增加一个内存映射链表,用来动态移动读指针。现在我来介绍一下具体原理。
其实环形缓冲区就是在最开始的时候申请一个大buffer,有一个读指针,一个写指针,随着数据写入和读取改变读写指针,具体分为三总情况:一、是读写速度差不多,这种情况比较简单。二、写的很快读的慢、这种情况写指针很快回头追上了读指针,这时候就会出现写buffer覆盖掉读指针的内存块,如果还继续读取数据那么数据就会错乱,如果存储视频里相当于界面变花了。这时候我们就用到了内存映射链表,我们通过内存映射链表把读指针移动到下一个完整的内存块上,实际上就是丢帧。这样就能够保证数据的完整性,三、就是读速度快,这种情况也比较简单,直接返回即可。下面我们来分析一下我的具体读写代码:
int CRAMFifoBuffer::fifo_write(char* pBuf, size_t size)
{
Mutex::Lock lock(mutex);
if (size > m_iLen)
return -1;
int iRet = 1;
NodeBuffer node;//这个是内存映射的具体结点数据
node.pNode = pwrite;//每次保存的写指针位置和大小
node.iLen = size;
m_NodeList.push_back(nod

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



