将QBuffer设置为大小受限制的FIFO? QT

时间:2018-06-19 14:31:41

标签: c++ qt audio qt5

我有一个连续的音频流,我只想保留最后50秒。

我现在这样做,但是我有问题:

  1. 缓冲区增长超过50秒。我试图在QByteArray上使用resize来使其与FIFO距离更近,但是它似乎并不在意它并继续增长,所以我想我对文档有误解。

  2. 经过15秒后声音突然变得丑陋->我不知道为什么声音突然撕裂(如果我在同一缓冲区中加载5分钟的本地声音,一切都会很好)。

  3. 最后但并非最不重要的一点是,缓冲区的行为不像FIFO,这就是我要保留最后50秒的目的

这是我的代码:(Windows10-Qt5)

buffer = new QBuffer;
arr = new QByteArray; 
arr->resize(200000);
buffer->setData(*arr); // buffer->setBuffer(*arr);
buffer->open(QIODevice::ReadWrite);

dataStream.setDevice(buffer); ` 

m_player = new QMediaPlayer(this);
m_player->setMedia(QMediaContent(), buffer);

[...]

connect(m_player, &QMediaPlayer::durationChanged, this, &MainWindow::durationChanged);
connect(m_player, &QMediaPlayer::positionChanged, this, &MainWindow::positionChanged);

我在最新的插槽中刷新缓冲区持续时间。 因此,缓冲当然会大于50秒,并且15秒后声音会被切断。

有人知道如何使用Qt设置大小受限制的FIFO缓冲区吗?

-------------------------------------------------- -----------编辑-------------------------------------- ----------------------------

我发现它越来越近,但是我想念其中的东西:

//.cpp :


#define SAMPLE_RATE 22050
#define CHANNELS 1
#define SAMPLE_SIZE 16
#define SAMPLE_TYPE SignedInt

myAudio::myAudio()
{
formatIn.setSampleRate(SAMPLE_RATE);
formatIn.setChannelCount(CHANNELS);
formatIn.setSampleSize(SAMPLE_SIZE);
[...]
formatIn.setByteOrder(QAudioFormat::LittleEndian);
formatIn.setSampleType(QAudioFormat::SAMPLE_TYPE);

formatOut. //same than formatIn
[...]

//configure device
 audioOut = new QAudioOutput(deviceOut,formatOut,0);
 audioIn  = new QAudioInput (deviceIn, formatIn,0);


  buff.resize(0x10000);   //create a rx buffer

  pbuff=buff.data();       //get the buff address;
  RXbuff=0;                //set RX buffer pointer

  qDebug()<<"File open"<<open(QIODevice::ReadWrite);
  qDebug()<<"is device Sequential="<<isSequential();
  audioIn->start(this); //start reading device

  audioOut->setVolume(0.5);  //volume 0 to 1.0
  audioOut->start(this);    //start writing to device
}

//QIODevice Class (Protected Functions)This function is called by QIODevice.
//send to output(Speaker)

qint64 myAudio::readData(char *data, qint64 len)
{
static quint64 TXbuff=0;
qint64 total = 0;
while (len > total  && RXbuff>TXbuff)//write and synchonise buffers
   {
     //write data to speaker
    memcpy(&data[total],&pbuff[TXbuff%0x10000], 2);    //copy 2 Bytes
    TXbuff+=2; //point to next buffer 16 bit location
    total+=2;
   }
return total;  //the reset interval
}


//audio input (from Microphone)
qint64 myAudio::writeData(const char *data, qint64 len)
{
int total=0;
while (len > total)
   {
    memcpy(&pbuff[RXbuff%0x10000],&data[total], 2); //write 2Bytes into 
circular buffer(64K)
    RXbuff+=2; //next 16bit buffer location
    total+=2;  //next data location
  }
 return (total); //return total number of bytes received
}

qint64 myAudio::bytesAvailable() const{return 0;}

我想念的是很基本的...没有人知道何时/如何称呼这些方法?!

0 个答案:

没有答案