QAudioOutput *output;
QIODevice *outputDevice;
output = NULL;
QAudioFormat format;
format.setSampleRate(8000);
format.setChannelCount(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setSampleType(QAudioFormat::SignedInt);
format.setByteOrder(QAudioFormat::LittleEndian);
if(output == NULL)
{
output = new QAudioOutput(format,this);
output->setVolume(0.05);
outputDevice = output->start();//開始播放
}
while(1)
{
QThread::msleep(1);
QByteArray array;
int len_fVar = sizeof(fVar);
array.resize(len_fVar);
memcpy(array.data(), &fVar, len_fVar);
outputDevice->write(array,array.size());
}
}
其實就是最后的write出問題,嘗試發送完后waitForBytesWritten以及發送前判斷bytesToWrite()好像都不能解決問題,求助!
uj5u.com熱心網友回復:
fVar是什么?uj5u.com熱心網友回復:
fVar就是采集到資料的存放陣列uj5u.com熱心網友回復:
有什么記憶體泄漏問題?給的資訊太少了從你這點代碼里看不出來的另外一個跟記憶體泄漏無關的問題,你這邊有點多余啊,沒有必要創建一個QByteArray,直接outputDevice->write((const char *)(&fVar), sizeof(fVar))不就行了
而且你也沒有判斷write的結果(就是實際write了多少),你怎么進行后續處理?
uj5u.com熱心網友回復:
就是這樣一直跑的話記憶體會一直漲,確實是沒必要在轉一下QBytearray,后續沒有什么處理就是一直將陣列的資料write出去,fVar陣列的長度不大就1k多位元組,即使判斷write后回傳的長度要怎么處理呢?!在下邊這個帖子有些介紹,但是沒太明白:https://bbs.csdn.net/topics/391027979
“QIODevice(QTcpSocket是QIODevice的子類)有內部緩沖區,如果不設定固定大小,會根據你要寫入的資料,不斷地重新分配記憶體。你可以自己設定一個門限,比如512K,每次寫入前呼叫一下bytesToWrite(),看看剩余未寫入資料有多少,如果接近你設定的門限,就等下一輪再呼叫write,這樣可以避免記憶體碎片。”
uj5u.com熱心網友回復:
我再看了一下你這個代碼是有問題,你用的sleep,所以就一直回圈在寫啊,都沒有給人家讀的機會,所以才會一直漲吧你這個陣列資料是固定的嗎,你就一直寫固定一樣的資料出去這樣?
你應該要看一下官方例子Audio Output Example里面是怎么寫的
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/250349.html
標籤:Qt
