标签:时序 对齐 原理 als 数据 写入 void size 策略
FIFO是模拟双端口缓冲器而设计的,先进的数据先出,进出的数据可以是1个至n个不等,主要解决时序问题。就像排队买菜,先来的排在前面,后来的排后面,先来的先买菜。
1. 策略:排队需要缓冲区BUF队列,模仿“排队买菜”和“双端口器件”原理,维持BUF队列中第一个数据永远在第一个存储位。
2. 读出:一个或n个,从第一个存储位开始读,读完后将剩余数据提到最前端,第一个数据对齐第一个存储位。
3. 写入:从队列后加入。
头文件:
#ifndef FIFOH #define FIFOH #include <windows.h> #define FifoMaxBufSize 200000UL //200KB class CFIFO { public: int iFifoBufSize;//当前缓冲区数 void Reset(void);//复位数据 bool Read(BYTE *pData, int iReadSize);//读出 bool Write(BYTE *pData, int iWriteSize);//写入 private: BYTE Buf[FifoMaxBufSize];//缓冲区队列 }; #endif
源文件:
#include "FIFO.h" void CFIFO::Reset(void)//复位数据 { iFifoBufSize = 0;//复位当前缓冲区数 } bool CFIFO::Read(BYTE *pData, int iReadSize)//读出 { if(iReadSize > iFifoBufSize) return false;//要求不能满足 memcpy(pData, Buf, iReadSize);//考出 iFifoBufSize -= iReadSize;//减去移走数据 if (iReadSize > 0)//有数据需要移动 { memcpy(&Buf[0], &Buf[iReadSize], iFifoBufSize);//移动缓冲区剩余数据至顶部 } return true; } bool CFIFO::Write(BYTE *pData, int iWriteSize)//写入 { if ((iFifoBufSize + iWriteSize) > FifoMaxBufSize) return false;//要求不能满足 memcpy(&Buf[iFifoBufSize], pData, iWriteSize);//从队尾处写入 iFifoBufSize += iWriteSize;//加入写入量 return true; }
在读取FFmpeg解压后音频片数据获得成功,其他应用可调整最大队列量,确保不溢出。
标签:时序 对齐 原理 als 数据 写入 void size 策略
原文地址:https://www.cnblogs.com/hbg200/p/10599312.html