2

私は次のようなQThreadでオーディオストリームを再生しています:

// Setup
QAudioFormat format;
format.setFrequency(44100);
format.setChannels(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
format = info.nearestFormat(format);
this->m_AudioOutput = new QAudioOutput(format, this);
DECLARE_ALIGNED(16,uint8_t,audio_buffer)[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];

// Playback
QIODevice *iodevice = this->m_AudioOutput->start();
for(;;) {
    // Routine that fetches audio data from network
    // data_size is length of the buffer
    fetch_packet(&audio_buffer, data_size);

    qint64 dataRemaining = data_size;
    const char *b2 = (const char *)audio_buffer;
    while (dataRemaining) {
    qint64 bytesWritten = iodevice->write((const char *)b2, dataRemaining);
        dataRemaining -= bytesWritten;
        b2 = b2 + bytesWritten ;
    }

    msleep(10);
}

オーディオは問題なく再生されますが、アプリのメモリ消費量は時間の経過とともに増加するようです(1分あたり約2MB)。私は何か間違ったことをしたのだろうかと思っていました。バッファが読み取られて再生に使用された後、バッファQAudioOutputを削除する責任があると思いますか?QIODevice

4

1 に答える 1

2

私はそうは思わない、ドキュメントは言う:

オーディオストリームの再生を開始するには、QIODeviceを使用してstart()を呼び出すだけです。 QAudioOutputは、ioデバイスから必要なデータをフェッチします。

データを読み取るだけです。QIODeviceはバッファを管理する必要があります。確かに、QIODevice :: size()を使用してバッファーのサイズをチェックし、バッファーが大きくなっているかどうかを確認できます。

于 2012-12-21T19:43:28.063 に答える