【问题标题】:Qt - how to set audio playback starts from the beginning of buffer?Qt - 如何设置音频播放从缓冲区的开头开始?
【发布时间】:2012-05-07 17:40:29
【问题描述】:

我有一个大小为 4096 的缓冲区,并将数据存储到其中,如果缓冲区已满,它将从缓冲区的开头开始。看起来这很好用。

但我在播放缓冲区数据时遇到问题。

QByteArray          m_buffer;
QBuffer             m_audioOutputIODevice;
QAudioOutput*       m_audioOutput;
m_audioOutputIODevice.close();
m_audioOutputIODevice.setBuffer(&m_buffer);
m_audioOutputIODevice.open(QIODevice::ReadOnly);
m_audioOutput->start(&m_audioOutputIODevice);

现在我可以从缓冲区播放声音,但是当它到达缓冲区末尾时,播放停止。 我怎么能改变代码,所以当它到达缓冲区的末尾时,它会从头开始? 非常感谢

更新代码:

connect(m_audioOutput,SIGNAL(stateChanged(QAudio::State)),SLOT(resetPlayBuffer(QAudio::State)));

    void bufferPlayback::resetPlayBuffer (QAudio::State state)
{
    if (state == QAudio::IdleState) {
        m_audioOutputIODevice.close();
        m_audioOutputIODevice.setBuffer(&m_buffer);
        m_audioOutputIODevice.open(QIODevice::ReadOnly);
    }
}

【问题讨论】:

    标签: c++ qt audio


    【解决方案1】:

    void stateChanged ( QAudio::State state )

    【讨论】:

    • 我也尝试了以下代码,但失败了。我认为是你提到的方法,也许我弄错了?我会更新问题中的代码:) 更易于阅读
    • 现在我可以继续录制和播放音频了,但是每次播放之间会有间隙,因为qAudioOutput是从IdleState恢复的
    • 您是否尝试过在播放状态发生变化时重新开始播放?
    • 嗨,我这样做了,但是每 10 秒有一个“间隙”(我将音频长度设置为 10 秒),因为每隔 10 秒,audioOutput 会先停止然后再启动。
    【解决方案2】:

    AFAICT QAudioOutput 没有对音频循环的任何内置支持,因此我认为您必须通过定期向 QAudioOutput 设备发送新的音频缓冲区来模拟音频循环,这样它就永远不会用完音频字节到玩。

    我认为最简单的方法是编写你自己的 QIODevice 子类,它假装是一个很长(无限?)的文件,但在查询时一遍又一遍地返回你的循环样本。然后将您的 QIODevice-subclass-obect 作为参数传递给 QAudioOutput::start()。

    【讨论】:

    • 您好,我试过这个方法,但我听不到任何声音。将深入挖掘。
    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多