学习QT快5个月了,终于想写一些东西了,希望大家不要见笑,在写基于 ffmpeg的视频处理中,需要一个缓冲存储音频数据以便于QAudio播放。QAudioOutput支持i从QIODevice读取数据。希望能有一个继承于QIODevice能通过另外一个线程不断的写入数据来不断的播放。于是想到了环形缓冲。能在有限的内存里。实现上诉功能。同时还可用于其他通讯程序。在写之前看了一下QIODevice的源码以及QBuffer的源码。初步了解了QT基本程序框架。
QLoopBuffer.h
/********************************************************************/
/****************************************************************************
** copy right:lbwave(lbwave@sina.com)
环形缓冲:环形缓冲是在一段连续分配的有限内存空间内,首尾衔接存储数据。环形缓冲有以下几个特点
1、内存分配空间连续,大小固定,便于内存管理。
2、遵循先入先出的原则。及读写的地址指针不受用户控制。而且读写指针分开。
根据上述特点,为了提高环形缓从的数据安全:
1、环形缓冲在使用者看到的是一个存储池。使用者只能向缓冲池注入数据和读出数据。可以获得缓冲池的信息。但不能操作数据。因此在缓冲中随意移动指针是有害的。
2、在环形缓冲中seek函数和pos 是不应该存在的。
3、read函数仅从缓冲头读出数据,并清除出缓冲区。
3、write函数从缓冲尾写入数据。
4、缓冲中重要的数据:usedsize(可读数据大小) buffersize(缓冲池大小)
以下是遵循QT的源代码标准写的环形缓冲类:
1、继承于QIODevice
在QT很多输入输出类都是基于QIODevice的操作。从QIODvice中继承可以方便的用于输入输出操作。
2、支持多线程操作
3、有读写同步操作
4、支持阻塞方式读写
以下环形缓冲类参照了QBuffer.h QBuffer.cpp的写法
QLoopBuffer详解:
****************************************************************************/
#ifndef QLoopBuffer_H
#define QLoopBuffer_H
#include <QtCore/qiodevice.h>
#include <QtCore/qbytearray.h>
#include <QtCore/QMutex>
#include <QtCore/QWaitCondition>
#include "private/qiodevice_p.h"
#include <QDebug>
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
QT_MODULE(Core)
class QObject;
class QLoopBufferPrivate;
class QLoopBuffer : public QIODevice
{
#ifndef QT_NO_QOBJECT
Q_OBJECT
#endif<
基于QIODevice的环形缓冲
最新推荐文章于 2023-06-05 08:00:00 发布