QAudioSink 类

QAudioSink 类提供了一个向音频输出设备发送音频数据的接口。更多...

头文件 #include <QAudioSink>
CMakefind_package(Qt6 REQUIRED COMPONENTS Multimedia)
target_link_libraries(mytarget PRIVATE Qt6::Multimedia)
qmakeQT += multimedia
继承 QObject

公共函数

QAudioSink(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
virtual~QAudioSink()
qsizetypebufferSize() const
qsizetypebytesFree() const
qint64elapsedUSecs() const
QtAudio::Errorerror() const
QAudioFormatformat() const
boolisNull() const
qint64processedUSecs() const
voidreset()
voidresume()
voidsetBufferSize(qsizetype value)
voidsetVolume(qreal volume)
voidstart(QIODevice *device)
QIODevice *start()
QtAudio::Statestate() const
voidstop()
voidsuspend()
qrealvolume() const

信号

voidstateChanged(QtAudio::State state)

详细描述

您可以使用系统的默认音频输出设备来构建音频输出。也可以使用特定的 QAudioDevice 创建 QAudioSink。在创建音频输出时,还应传入用于播放的 QAudioFormat(有关详细信息,请参阅 QAudioFormat 类描述)。

播放文件

播放音频流只需要调用 start() 并传入一个 QIODevice。然后 QAudioSink 将从 IO 设备获取所需的数据。因此,播放音频文件就像这样

QFile sourceFile;   // class member.
QAudioSink* audio; // class member.
{
    sourceFile.setFileName("/tmp/test.raw");
    sourceFile.open(QIODevice::ReadOnly);

    QAudioFormat format;
    // Set up the format, eg.
    format.setSampleRate(8000);
    format.setChannelCount(1);
    format.setSampleFormat(QAudioFormat::UInt8);

    QAudioDevice info(QMediaDevices::defaultAudioOutput());
    if (!info.isFormatSupported(format)) {
        qWarning() << "Raw audio format not supported by backend, cannot play audio.";
        return;
    }

    audio = new QAudioSink(format, this);
    connect(audio, QAudioSink::stateChanged, this, &AudioInputExample::handleStateChanged);
    audio->start(&sourceFile);
}

如果音频系统和输出设备支持,文件将开始播放。如果您运气不佳,请检查 error() 函数 的错误。

文件播放完毕后,我们需要停止设备

void AudioOutputExample::stopAudioOutput()
{
    audio->stop();
    sourceFile.close();
    delete audio;
}

在任意时刻,QAudioSink 都会处于以下四种状态之一:活动、挂起、停止或空闲。这些状态由 QtAudio::State 枚举描述。状态变化通过 stateChanged() 信号 报告。可以使用这个信号来更新应用程序的 GUI,例如,切换 播放/暂停 按钮的状态。您可以直接通过 suspend()()、stop()()、reset()()、resume()() 和 start()() 来请求状态变化。

如果发生错误,可以使用 error() 函数 获取错误类型。有关报告的可能错误的描述,请参见 QtAudio::Error 枚举。当遇到 QtAudio::UnderrunError 时,状态将变为 QtAudio::IdleState,当遇到其他错误时,状态将变为 QtAudio::StoppedState。您可以通过连接到 stateChanged() 信号 来检查错误

void AudioOutputExample::handleStateChanged(QAudio::State newState)
{
    switch (newState) {
        case QAudio::IdleState:
            // Finished playing (no more data)
            AudioOutputExample::stopAudioOutput();
            break;

        case QAudio::StoppedState:
            // Stopped for other reasons
            if (audio->error() != QAudio::NoError) {
                // Error handling
            }
            break;

        default:
            // ... other cases as appropriate
            break;
    }
}

另请参阅 QAudioSourceQAudioDevice

成员函数文档

[显式] QAudioSink::QAudioSink(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)

构造一个新的音频输出并将其附加到 parent。使用输出 format 参数使用默认音频输出设备。

[显式] QAudioSink::QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)

构造一个新的音频输出并将其附加到 parent。使用 audioDevice 指引用的设备与输出 format 参数一起使用。

[虚 noexcept] QAudioSink::~QAudioSink()

销毁此音频输出。

这将会释放所使用的任何系统资源,并释放所有缓冲区。

qsizetype QAudioSink::bufferSize() const

返回音频缓冲区的大小(以字节为单位)。

在调用 start() 之前,返回平台默认值。在调用 start() 但之前已调用 setBufferSize(),则返回由 setBufferSize() 设置的值。在调用 start() 之后,返回正在使用的实际缓冲区大小。这可能不是之前由 setBufferSize() 设置的值。

另请参阅 setBufferSize

qsizetype QAudioSink::bytesFree() const

返回音频缓冲区中可用的空闲字节数。

注意:返回的值仅在处于 QtAudio::ActiveStateQtAudio::IdleState 状态时有效,否则返回零。

qint64 QAudioSink::elapsedUSecs() const

返回自调用start()以来经过的微秒,包括空闲和挂起状态的时间。

QtAudio::Error QAudioSink::error() const

返回错误状态。

QAudioFormat QAudioSink::format() const

返回正在使用的QAudioFormat

bool QAudioSink::isNull() const

如果QAudioSink实例为空,则返回true,否则返回false

qint64 QAudioSink::processedUSecs() const

返回自调用start()以来处理的音频数据量(以微秒为单位)。

void QAudioSink::reset()

丢弃缓冲区中的所有音频数据,将缓冲区重置为零。

void QAudioSink::resume()

在挂起后,继续处理音频数据。

state()设置为挂起时suspend()时的状态,并将error()设置为QAudioError::NoError。如果音频插件的状态不是QtAudio::SuspendedState,则此函数不做任何事情。

void QAudioSink::setBufferSize(qsizetype value)

将音频缓冲区大小设置为以字节为单位的value

注意:此函数可以在start()之前任何时候调用。在start()之后对此的调用会被忽略。不应假设设置的缓冲区大小是实际使用的缓冲区大小 - 后start()后任何时候调用bufferSize()以返回实际正在使用的缓冲区大小。

另请参阅:bufferSize

void QAudioSink::setVolume(qreal volume)

将输出音量设置为volume

音量按线性从0.0(静音)到1.0(全音量)缩放。在此范围以外的值将被截断。

默认音量为1.0

注意:音量调整将改变此音频流的音量,而不是全局音量。

UI音量控件通常应该是非线性的。例如,使用对数尺度将产生感知响度的线性变化,这是用户通常期望的音量控件的行为。有关详细信息,请参阅QtAudio::convertVolume

另请参阅:volume

void QAudioSink::start(QIODevice *device)

开始从设备传输音频数据到系统音频输出。该设备必须在只读读写模式下打开。

如果QAudioSink成功输出音频数据,state()返回QtAudio::ActiveStateerror()返回QtAudio::NoError,并将stateChanged()信号发出。

如果在过程中出现问题,error()将返回QtAudio::OpenErrorstate()将返回QtAudio::StoppedState,并将stateChanged()信号发出。

另请参阅QIODevice

QIODevice *QAudioSink::start()

返回一个指针,指向用于传输数据到系统音频输出的内部QIODevice。设备将已打开,可以直接调用write()写入数据。

注意:在流停止或启动另一个流后,指针将无效。

如果QAudioSink能够访问系统音频设备,state()将返回QtAudio::IdleStateerror()将返回QtAudio::NoError,并将stateChanged()信号发出。

如果在过程中出现问题,error()将返回QtAudio::OpenErrorstate()将返回QtAudio::StoppedState,并将stateChanged()信号发出。

另请参阅QIODevice

QtAudio::State QAudioSink::state() const

返回音频处理的状态。

[signal] void QAudioSink::stateChanged(QtAudio::State state)

当设备状态state发生变化时,会发出此信号。这是当前音频输出的状态。

注意:直到并包括Qt 6.6,QtAudio命名空间被称为QAudio。基于字符串的连接到此信号的参数类型必须使用QAudio::Stateconnect(source, SIGNAL(stateChanged(QAudio::State)), ...);

void QAudioSink::stop()

停止音频输出,脱离系统资源。

error()设置为QtAudio::NoError,将state()设置为QtAudio::StoppedState,并发出stateChanged()信号。

void QAudioSink::suspend()

停止处理音频数据,保留缓冲区中的音频数据。

error()设置为QtAudio::NoError,将state()设置为QtAudio::SuspendedState,并发出stateChanged()信号。

qreal QAudioSink::volume() const

返回介于0.0和1.0之间的音量。

另请参阅setVolume

© 2024 Qt 公司有限公司。本页面中包含的文档贡献均为各自所有者的版权。提供的文档受 GNU 自由文档许可协议第 1.3 版 许可,该协议由自由软件基金会发布。Qt 及相应标志是芬兰及世界各地的 Qt 公司的商标。所有其他商标均为各自所有者的财产。