이 페이지에서

QAudioSink Class

QAudioSink 클래스는 오디오 데이터를 오디오 출력 장치로 전송하기 위한 인터페이스를 제공합니다. 더 보기...

헤더: #include <QAudioSink>
CMake: find_package(Qt6 REQUIRED COMPONENTS Multimedia)
target_link_libraries(mytarget PRIVATE Qt6::Multimedia)
qmake: QT += multimedia
상속합니다: QObject

공용 함수

QAudioSink(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
virtual ~QAudioSink() override
(since 6.10) qsizetype bufferFrameCount() const
qsizetype bufferSize() const
qsizetype bytesFree() const
qint64 elapsedUSecs() const
QtAudio::Error error() const
QAudioFormat format() const
(since 6.10) qsizetype framesFree() const
bool isNull() const
qint64 processedUSecs() const
void reset()
void resume()
(since 6.10) void setBufferFrameCount(qsizetype value)
void setBufferSize(qsizetype value)
void setVolume(qreal volume)
QIODevice *start()
(since 6.11) void start(Callback &&cb)
void start(QIODevice *device)
QtAudio::State state() const
void stop()
void suspend()
qreal volume() const

신호

void stateChanged(QtAudio::State state)

상세 설명

시스템의 기본 오디오 출력 장치로 오디오 출력을 구성할 수 있습니다. 특정 QAudioDevice 으로 QAudioSink를 생성할 수도 있습니다. 오디오 출력을 생성할 때 재생에 사용할 QAudioFormat 도 함께 보내야 합니다(자세한 내용은 QAudioFormat 클래스 설명 참조).

QAudioSink는 두 가지 모드로 사용할 수 있습니다:

  • 애플리케이션 스레드에서 QIODevice 사용
  • 오디오 스레드에서 콜백 기반 인터페이스 사용

QIODevice 인터페이스

오디오 스트림 재생을 시작하려면 QIODevice 으로 start()를 호출하기만 하면 됩니다. 그러면 QAudioSink가 io 장치에서 필요한 데이터를 가져옵니다. 따라서 오디오 파일을 재생하는 것은 매우 간단합니다:

QFile sourceFile; // 클래스 멤버.QAudioSink* audio; // 클래스 멤버.{ sourceFile.setFileName("/tmp/test.raw"); sourceFile.open(QIODevice::읽기 전용);    QAudioFormat format; // 포맷 설정, 예: format.setSampleRate(44100); format.setChannelCount(1); format.setSampleFormat(QAudioFormat::Int16);    QAudioDevice 정보(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 열거형에 의해 설명됩니다.

스레딩 모델 및 버퍼링

QIODevice 인터페이스는 애플리케이션 스레드에서 사용하도록 설계되었습니다. 대기 없는 링버퍼는 오디오 스레드와 통신하는 데 사용됩니다. 이 링버퍼의 크기는 setBufferSize()로 구성할 수 있으며 기본값은 250ms입니다. 이 버퍼의 상태는 bytesFree()로 쿼리할 수 있습니다. 링버퍼에 데이터가 부족하면 오디오 스레드는 오디오 장치에 무음을 보내고 상태가 QtAudio::IdleState 로 변경되며 QIODevice 에서 더 많은 데이터를 사용할 수 있게 되면 QtAudio::ActiveState 으로 다시 시작됩니다.

콜백 인터페이스

오디오 지연 시간을 낮추기 위해 선호하는 방법은 콜백 기반 인터페이스를 사용하는 것입니다. 이를 사용하면 QIODevice 을 거치지 않고 오디오 장치에 직접 오디오 데이터를 쓸 수 있습니다. 이 작업은 오디오 스레드에서 호출되는 콜백 함수와 함께 start()을 호출하여 수행됩니다. 이 콜백 함수는 오디오 백엔드에서 데이터가 필요할 때마다 QSpan<샘플 유형>으로 호출됩니다.

QAudioSink* audio; // 클래스 멤버.float phase; // 클래스 멤버{ .QAudioFormat format; // 포맷 설정, 예: format.setSampleRate(44100); format.setChannelCount(2); format.setSampleFormat(QAudioFormat::Float);    QAudioDevice 정보(QMediaDevices::defaultAudioOutput()); if (!info.isFormatSupported(format)) {        qWarning() << "Raw audio format not supported by backend, cannot play audio.";
       return; } audio = new QAudioSink(format, this); float phaseIncrement = 2 * M_PI * 220.0 / format.sampleRate(); // 220Hz 사인파 audio->start([&phase, phaseIncrement] (QSpan<플로트> 인터리브 오디오 버퍼) { // 오디오 콜백은 잠재적으로 차단할 수 있는 함수를 호출하지 않아야  합니다 // 사인파로 오디오 버퍼를 채웁니다 const int sampleCount = interleavedAudioBuffer.size() / 2; // 스테레오, 그래서 2로 나누기 for(int i = 0; i < sampleCount; ++i) { float sample = std::sin(phase); interleavedAudioBuffer[i * 2] = sample; // 왼쪽 채널interleavedAudioBuffer[i * 2 + 1] = sample; // 오른쪽 채널phase += phaseIncrement; // 다음 샘플의 위상 증가} }); if (!audio->error()== QtAudio::Error::NoError) { // 다른 start() 시그니처와 더불어, // 백엔드가 콜백 기반 IO를 구현하지 않는  경우 오디오 콜백 시작은 실패합니다 (API는 모든 주요 // 플랫폼에서  사용 가능 ) // * 오디오 콜백의 시그니처가 format.sampleFormat()와 일치하지  않습니다 .
        qWarning() << "Error starting audio output:" << audio->errorString();
    } }

QIODevice-기반 인터페이스와 달리 QAudioSink는 활성, 일시 중단 및 중지 상태만 가능합니다. 콜백을 사용할 때는 setBufferSize() API를 사용할 수 없으며, 콜백 인수의 크기는 오디오 백엔드에 의해 결정됩니다.

참고: 이 API는 콜백 API를 지원하는 플랫폼에서만 사용할 수 있습니다: Apple의 CoreAudio(macOS, iOS 등), Windows, Linux(PulseAudio 또는 PipeWire 백엔드 사용) 및 Android.

참고: 콜백은 소프트 실시간 오디오 스레드에서 호출됩니다. 오디오 글리치 또는 드롭아웃이 발생할 수 있으므로 콜백이 차단되지 않도록 하는 것이 중요합니다. 여기에는 IO 차단, 뮤텍스 잠금, 메모리 할당 또는 기타 차단할 수 있는 모든 작업을 수행하는 것이 포함됩니다. 모범 사례는 Ross Bencina의 실시간 오디오 프로그래밍 101: 시간은 아무것도 기다리지 않는다 문서를 참조하세요. 또한 clang의 실시간 새니타이저를 사용하여 오디오 콜백의 유효성을 검사하는 것도 고려해 보세요.

상태 및 오류 처리

상태 변경은 stateChanged() 신호를 통해 보고됩니다. 예를 들어 이 신호를 사용하여 애플리케이션의 GUI를 업데이트할 수 있으며, 여기서는 play/pause 버튼의 상태를 변경하는 것이 일상적인 예입니다. suspend (), stop(), reset(), resume(), start()로 직접 상태 변경을 요청할 수 있습니다.

오류가 발생하면 QAudioSink는 StoppedState 로 들어갑니다. error () 함수를 사용하여 error type 를 검색할 수 있습니다. 보고되는 가능한 오류에 대한 설명은 QtAudio::Error 열거형을 참조하세요. stop () 또는 reset()을 호출하면 오류 상태가 NoError 로 재설정됩니다.

stateChanged() 신호에 연결하여 오류를 확인할 수 있습니다:

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

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

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

QAudioSourceQAudioDevice참조하세요 .

멤버 함수 문서

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

새 오디오 출력을 생성하고 parent 에 첨부합니다. 기본 오디오 출력 장치는 출력 format 매개변수와 함께 사용됩니다. format 이 기본 초기화되어 있으면 오디오 장치의 기본 형식으로 설정됩니다.

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

새 오디오 출력을 생성하고 parent 에 첨부합니다. audioDevice 에서 참조하는 장치는 출력 format 매개변수와 함께 사용됩니다. format 이 기본 초기화되어 있으면 형식은 기본 형식인 audioDevice 으로 설정됩니다.

[override virtual noexcept] QAudioSink::~QAudioSink()

이 오디오 출력을 삭제합니다.

이렇게 하면 사용된 모든 시스템 리소스가 해제되고 버퍼가 해제됩니다.

[since 6.10] qsizetype QAudioSink::bufferFrameCount() const

오디오 버퍼 크기를 프레임 단위로 반환합니다.

start() 이전에 호출되면 플랫폼 기본값을 반환합니다. start() 이전에 setBufferSize() 또는 setBufferFrameCount() 가 호출된 경우 setBufferSize() 또는 setBufferFrameCount() 에서 설정한 값을 반환합니다. start() 이후에 호출된 경우 사용 중인 실제 버퍼 크기를 반환합니다. 이 값은 이전에 setBufferSize() 또는 setBufferFrameCount() 에서 설정한 것과 다를 수 있습니다.

이 함수는 Qt 6.10에 도입되었습니다.

setBufferFrameCount() 와 bufferSize도 참조하십시오 .

qsizetype QAudioSink::bufferSize() const

오디오 버퍼 크기를 바이트 단위로 반환합니다.

start() 이전에 호출되면 플랫폼 기본값을 반환합니다. start() 이전에 setBufferSize() 또는 setBufferFrameCount() 가 호출된 경우 setBufferSize() 또는 setBufferFrameCount() 에서 설정한 값을 반환합니다. start() 이후에 호출된 경우 사용 중인 실제 버퍼 크기를 반환합니다. 이 값은 setBufferSize() 또는 setBufferFrameCount() 에서 이전에 설정한 값과 다를 수 있습니다.

setBufferSize() 및 bufferFrameCount도 참조하세요 .

qsizetype QAudioSink::bytesFree() const

오디오 버퍼에서 사용 가능한 여유 바이트 수를 반환합니다.

참고: 반환된 값은 QtAudio::ActiveState 또는 QtAudio::IdleState 상태일 때만 유효하며, 그렇지 않으면 0을 반환합니다.

framesFree도 참조하세요 .

qint64 QAudioSink::elapsedUSecs() const

유휴 및 일시 중단 상태의 시간을 포함하여 start()가 호출된 이후의 마이크로초를 반환합니다.

QtAudio::Error QAudioSink::error() const

오류 상태를 반환합니다.

QAudioFormat QAudioSink::format() const

사용 중인 QAudioFormat 을 반환합니다.

[since 6.10] qsizetype QAudioSink::framesFree() const

오디오 버퍼에서 사용 가능한 여유 프레임 수를 반환합니다.

참고: 반환된 값은 QtAudio::ActiveState 또는 QtAudio::IdleState 상태일 때만 유효하며, 그렇지 않으면 0을 반환합니다.

이 함수는 Qt 6.10에 도입되었습니다.

bytesFree참조하세요 .

bool QAudioSink::isNull() const

QAudioSink 인스턴스가 null 인 경우 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

qint64 QAudioSink::processedUSecs() const

start()가 호출된 이후 처리된 오디오 데이터의 양(마이크로초 단위)을 반환합니다.

void QAudioSink::reset()

오디오 출력을 즉시 중단하고 현재 버퍼에 있는 모든 오디오 데이터를 삭제합니다. QIODevice 으로 푸시된 모든 보류 중인 오디오 데이터는 무시됩니다.

stop()도 참조하세요 .

void QAudioSink::resume()

suspend() 이후 오디오 데이터 처리를 재개합니다.

state()를 suspend()가 호출되었을 때 싱크의 상태로 설정합니다. 오디오 싱크의 상태가 QtAudio::SuspendedState 이 아닌 경우 이 함수는 아무 작업도 수행하지 않습니다.

[since 6.10] void QAudioSink::setBufferFrameCount(qsizetype value)

오디오 버퍼 크기를 프레임 수( value )로 설정합니다.

참고: 이 함수는 start() 이전에 언제든지 호출할 수 있습니다. start () 이후에는 이 함수에 대한 호출이 무시됩니다. 설정된 버퍼 크기가 실제 사용되는 버퍼 크기라고 가정해서는 안 됩니다. start() 이후에 언제든지 bufferFrameCount()를 호출하여 사용 중인 실제 버퍼 크기를 반환하세요.

이 함수는 Qt 6.10에 도입되었습니다.

bufferFrameCount() 및 setBufferSize참조하십시오 .

void QAudioSink::setBufferSize(qsizetype value)

오디오 버퍼 크기를 value (바이트)로 설정합니다.

참고: 이 함수는 start() 앞에 언제든지 호출할 수 있습니다. start () 이후에는 이 함수에 대한 호출이 무시됩니다. 설정된 버퍼 크기가 실제 사용되는 버퍼 크기라고 가정해서는 안 되며, start() 이후에 언제든지 bufferSize()를 호출하여 사용 중인 실제 버퍼 크기를 반환해야 합니다.

bufferSize() 및 setBufferFrameCount도 참조하세요 .

void QAudioSink::setVolume(qreal volume)

출력 볼륨을 volume 으로 설정합니다.

볼륨은 0.0 (무음)에서 1.0 (최대 볼륨)까지 선형적으로 조절됩니다. 이 범위를 벗어나는 값은 클램핑됩니다.

기본 볼륨은 1.0 입니다.

참고: 볼륨을 조정하면 글로벌 볼륨이 아니라 이 오디오 스트림의 볼륨이 변경됩니다.

UI 볼륨 컨트롤은 일반적으로 비선형적으로 조절해야 합니다. 예를 들어 로그 스케일을 사용하면 사용자가 일반적으로 볼륨 컨트롤에서 기대할 수 있는 선형적인 음량 변화가 발생합니다. 자세한 내용은 QtAudio::convertVolume()를 참조하세요.

volume()도 참조하세요 .

QIODevice *QAudioSink::start()

시스템의 오디오 출력으로 데이터를 전송하는 데 사용되는 내부 QIODevice 에 대한 포인터를 반환합니다. 장치가 이미 열려 있고 write()가 여기에 직접 데이터를 쓸 수 있습니다.

참고: 스트림이 중지되거나 다른 스트림을 시작하면 포인터가 유효하지 않게 됩니다.

QAudioSink 가 시스템의 오디오 장치에 액세스할 수 있는 경우 state()는 QtAudio::IdleState, error()는 QtAudio::NoError 를 반환하고 stateChanged() 신호가 방출됩니다.

이 프로세스 중에 문제가 발생하면 error()는 QtAudio::OpenError, state()는 QtAudio::StoppedState 을 반환하고 stateChanged() 신호가 전송됩니다.

QIODeviceQIODevice interface참조하세요 .

[since 6.11] template <typename Callback, QtAudio::if_audio_sink_callback<Callback> = true> void QAudioSink::start(Callback &&cb)

소프트-실시간 오디오 스레드에서 호출될 콜백 함수로 QAudioSink 을 시작합니다. 콜백은 QSpan<SampleType>을 인수로 받는 콜러블이며, SampleType은 QAudioSink 의 형식 중 QAudioFormat::SampleFormat 과 일치해야 합니다. 스팬은 인터리빙된 오디오 데이터로 채워져야 합니다.

QAudioSink 를 성공적으로 시작할 수 있으면 error()는 QtAudio::NoError 를 반환합니다.

이 과정에서 문제가 발생하면 error()는 QtAudio::OpenError, state()는 QtAudio::StoppedState 을 반환하고 stateChanged() 신호가 전송됩니다.

참고: 이 API는 콜백 API를 지원하는 플랫폼에서만 사용할 수 있습니다: Apple의 CoreAudio(macOS, iOS 등), Windows, Linux(PulseAudio 또는 PipeWire 백엔드 사용) 및 Android.

참고: 콜백은 소프트 실시간 오디오 스레드에서 호출됩니다. 오디오 글리치 또는 드롭아웃이 발생할 수 있으므로 콜백이 차단되지 않도록 하는 것이 중요합니다. 여기에는 IO 차단, 뮤텍스 잠금, 메모리 할당 또는 기타 차단할 수 있는 모든 작업을 수행하는 것이 포함됩니다. 모범 사례는 Ross Bencina의 실시간 오디오 프로그래밍 101: 시간은 아무것도 기다리지 않는다 문서를 참조하세요. 또한 clang의 실시간 새니타이저를 사용하여 오디오 콜백의 유효성을 검사하는 것도 고려해 보세요.

이 기능은 Qt 6.11에 도입되었습니다.

Callback interface참조하세요 .

void QAudioSink::start(QIODevice *device)

device 에서 시스템의 오디오 출력으로 오디오 데이터 전송을 시작합니다. ReadOnly 또는 ReadWrite 모드에서 device 을 열어야 합니다.

QAudioSink 가 오디오 데이터를 성공적으로 출력할 수 있으면 state()는 QtAudio::ActiveState, error()는 QtAudio::NoError 를 반환하고 stateChanged() 신호가 방출됩니다.

이 과정에서 문제가 발생하면 error()는 QtAudio::OpenError, state()는 QtAudio::StoppedState 을 반환하고 stateChanged() 신호가 방출됩니다.

QIODeviceQIODevice interface참조하세요 .

QtAudio::State QAudioSink::state() const

오디오 처리 상태를 반환합니다.

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

이 신호는 장치 state 가 변경되었을 때 방출됩니다. 오디오 출력의 현재 상태입니다.

참고: QtAudio 네임스페이스의 이름은 Qt 6.6까지 QAudio였습니다. 이 신호에 대한 문자열 기반 연결은 매개변수 유형으로 QAudio::State 을 사용해야 합니다: connect(source, SIGNAL(stateChanged(QAudio::State)), ...);

void QAudioSink::stop()

오디오 출력을 중지하고 시스템 리소스에서 분리합니다.

error()를 QtAudio::NoError, state()를 QtAudio::StoppedState 으로 설정하고 stateChanged() 신호를 내보냅니다.

참고: Linux 및 Darwin에서 이 작업은 기본 오디오 버퍼를 동기적으로 비우므로 버퍼 페이로드에 따라 지연이 발생할 수 있습니다. 모든 버퍼를 즉시 재설정하려면 reset 방법을 대신 사용하세요.

reset()도 참조하세요 .

void QAudioSink::suspend()

오디오 데이터 처리를 중지하여 버퍼링된 오디오 데이터를 보존합니다.

state()를 QtAudio::SuspendedState 로 설정하고 stateChanged() 신호를 내보냅니다.

qreal QAudioSink::volume() const

0.0에서 1.0 사이의 볼륨을 반환합니다.

setVolume()도 참조하세요 .

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.