QAudioSource Class
QAudioSource 클래스는 오디오 입력 장치에서 오디오 데이터를 수신하기 위한 인터페이스를 제공합니다. 더 보기...
| 헤더: | #include <QAudioSource> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Multimedia)target_link_libraries(mytarget PRIVATE Qt6::Multimedia) |
| qmake: | QT += multimedia |
| 상속합니다: | QObject |
공용 함수
| QAudioSource(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr) | |
| QAudioSource(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr) | |
| virtual | ~QAudioSource() override |
| qsizetype | bufferFrameCount() const |
(since 6.10) qsizetype | bufferSize() const |
| qsizetype | bytesAvailable() const |
| qint64 | elapsedUSecs() const |
| QtAudio::Error | error() const |
| QAudioFormat | format() const |
(since 6.10) qsizetype | framesAvailable() const |
| bool | isNull() const |
| qint64 | processedUSecs() const |
| void | reset() |
| void | resume() |
| void | setBufferFrameCount(qsizetype value) |
(since 6.10) 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 을 사용하여 QAudioSource를 만들 수도 있습니다. 오디오 입력을 생성할 때 녹음에 사용할 QAudioFormat 도 함께 보내야 합니다(자세한 내용은 QAudioFormat 클래스 설명 참조).
QAudioSink 는 두 가지 모드로 사용할 수 있습니다:
- 애플리케이션 스레드에서 QIODevice 사용
- 오디오 스레드에서 콜백 기반 인터페이스 사용
QIODevice 인터페이스
QAudioSource를 사용하면 오디오 입력 장치로 오디오를 녹음할 수 있습니다. 이 클래스의 기본 생성자는 시스템 기본 오디오 장치를 사용하지만 특정 장치에 대해 QAudioDevice 을 지정할 수도 있습니다. 또한 녹음하려는 QAudioFormat 을 전달해야 합니다.
QAudioSource를 시작하려면 QIODevice 을 열어놓고 start()을 호출하기만 하면 됩니다. 예를 들어 파일에 녹음하려면 다음과 같이 하면 됩니다:
QFile destinationFile; // 클래스 멤버QAudioSource* audio; // 클래스 멤버{ destinationFile.setFileName("/tmp/test.raw"); destinationFile.open( QIODevice::WriteOnly | QIODevice::Truncate ); QAudioFormat format; // 원하는 포맷 설정, 예:format.setSampleRate(44100); format.setChannelCount(1); format.setSampleFormat(QAudioFormat::Int16); QAudioDevice 정보 = QMediaDevices::defaultAudioInput(); if (!info.isFormatSupported(format)) { qWarning() << "Default format not supported, trying to use the nearest."; } audio = new QAudioSource(format, this); connect(audio, &.QAudioSource::stateChanged, this, &AudioInputExample::handleStateChanged); QTimer::singleShot(3000, this, &AudioInputExample::stopRecording); audio->start(&destinationFile); // 3000ms 동안 오디오 녹음}
지정한 형식이 입력 장치에서 지원되는 경우 녹음이 시작됩니다( QAudioDevice::isFormatSupported()로 확인할 수 있습니다). 문제가 발생하면 error() 함수를 사용하여 무엇이 잘못되었는지 확인하세요. stopRecording() 슬롯에서 녹음을 중지합니다.
void AudioInputExample::stopRecording() { audio->stop(); destinationFile.close(); delete audio; }
어느 시점에서든 QAudioSource는 활성, 일시 중단, 중지 또는 유휴의 네 가지 상태 중 하나가 됩니다. 이러한 상태는 QtAudio::State 열거형에 의해 지정됩니다.
QAudioSource는 녹음의 start() 이후 경과된 시간을 측정하는 여러 가지 방법을 제공합니다. processedUSecs() 함수는 기록된 마이크로초 단위의 스트림 길이를 반환하며, 오디오 입력이 일시 중단되거나 유휴 상태였던 시간은 제외합니다. elapsedUSecs () 함수는 start() 호출 이후 경과된 시간을 반환하며, QAudioSource가 어떤 상태에 있었는지에 관계없이 반환합니다.
스레딩 모델 및 버퍼링
QIODevice 인터페이스는 애플리케이션 스레드에서 사용하도록 설계되었습니다. 대기 없는 링버퍼는 오디오 스레드와 통신하는 데 사용됩니다. 이 링버퍼의 크기는 setBufferSize()로 구성할 수 있으며 기본값은 250ms입니다. 이 버퍼의 상태는 bytesFree()로 쿼리할 수 있습니다. 애플리케이션이 QIODevice 에서 제때 읽지 않아 링버퍼가 가득 차면 상태가 QtAudio::IdleState 로 변경되고 애플리케이션이 QIODevice 에서 데이터를 읽으면 QtAudio::ActiveState 로 재개됩니다. 이 상태 변경은 오디오 데이터를 떨어뜨리므로 드롭아웃을 방지하기 위해 항상 QIODevice 에서 가능한 한 빨리 읽어야 합니다.
콜백 인터페이스
오디오 지연 시간을 낮추기 위해 선호하는 방법은 콜백 기반 인터페이스를 사용하는 것입니다. 이를 사용하면 QIODevice 을 거치지 않고 오디오 장치에서 직접 오디오 데이터를 읽을 수 있습니다. 이는 오디오 스레드에서 호출되는 콜백 함수와 함께 start()을 호출하여 수행됩니다. 이 콜백 함수는 오디오 백엔드에서 데이터를 생성할 때마다 QSpan<const SampleType>을 사용하여 호출됩니다.
QAudioSource* audio; // 클래스 멤버.std::atomic<float> peakLevel; // 클래스 멤버{ .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 capture audio."; return; } audio = new QAudioSource(format, this); audio->start([&peakLevel] (QSpan<플로트> interleavedAudioBuffer) { float level = peakLevel.load(); for(float sample : interleavedAudioBuffer) { // 오디오 샘플에서 피크 레벨 계산level = std::max(level, std::abs(sample)); } peakLevel.store(level); // 참고: 애플리케이션 스레드에 알림을 주어야 하는 경우 오디오 콜백이 잠재적으로 차단 가능한 시스템 호출을 사용하지 않아야 하기 때문에 주의가 필요합니다. // 좋은 옵션은 자동 설정 이벤트(윈도우), eventfd(리눅스), 또는 macos의 kqueue/EVFILT_USER입니다.}); if (!audio->error()== QtAudio::Error::NoError) { // 다른 start() 서명 외에도, // * 백엔드가 콜백 기반 IO를 구현하지 않는 경우 (API는 모든 주요 플랫폼에서 사용 가능 ) // * audio callback의 서명이 format.sampleFormat()과 일치하지 않으면 오디오 콜백 시작은 실패합니다. qWarning() << "Error starting audio output:" << audio->errorString(); } }
QIODevice-기반 인터페이스와 달리 QAudioSource는 활성, 일시 중단 및 중지 상태만 가능합니다. 콜백을 사용할 때는 setBufferSize() API를 사용할 수 없으며, 콜백 인수의 크기는 오디오 백엔드에 의해 결정됩니다.
참고: 이 API는 콜백 API를 지원하는 플랫폼에서만 사용할 수 있습니다: Apple의 CoreAudio(macOS, iOS 등), Windows, Linux(PulseAudio 또는 PipeWire 백엔드 사용) 및 Android.
참고: 콜백은 소프트 실시간 오디오 스레드에서 호출됩니다. 오디오 글리치 또는 드롭아웃이 발생할 수 있으므로 콜백이 차단되지 않도록 하는 것이 중요합니다. 여기에는 IO 차단, 뮤텍스 잠금, 메모리 할당 또는 기타 차단할 수 있는 모든 작업을 수행하는 것이 포함됩니다. 모범 사례는 Ross Bencina의 실시간 오디오 프로그래밍 101: 시간은 아무것도 기다리지 않는다 문서를 참조하세요. 또한 clang의 실시간 새니타이저를 사용하여 오디오 콜백의 유효성을 검사하는 것도 고려해 보세요.
상태 및 오류 처리
상태 변경은 stateChanged() 신호를 통해 보고됩니다. suspend (), resume(), stop(), reset(), start()를 통해 직접 상태 변경을 요청할 수 있습니다.
오류가 발생하면 QAudioSource는 StoppedState 으로 들어갑니다. error type 는 error() 함수를 통해 검색할 수 있습니다. 보고되는 가능한 오류에 대한 설명은 QtAudio::Error 열거형을 참조하세요. stop () 또는 reset()을 호출하면 오류 상태가 NoError 로 재설정됩니다.
void AudioInputExample::handleStateChanged(QtAudio::State newState) { switch (newState) { case QtAudio::StoppedState: if (audio->error() != QtAudio::NoError) { // Error handling } else { // Finished recording } break; case QtAudio::ActiveState: // Started recording - read from IO device break; default: // ... other cases as appropriate break; } }
QAudioSink 및 QAudioDevice도 참조하세요 .
멤버 함수 문서
[explicit] QAudioSource::QAudioSource(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
새 오디오 입력을 생성하고 parent 에 연결합니다. 기본 오디오 입력 장치는 출력 format 매개변수와 함께 사용됩니다. format 이 기본 초기화되어 있으면 오디오 장치의 기본 형식으로 설정됩니다.
[explicit] QAudioSource::QAudioSource(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
새 오디오 입력을 생성하여 parent 에 연결합니다. audioDevice 에서 참조하는 장치는 format 매개변수와 함께 사용됩니다. format 이 기본 초기화되어 있으면 형식은 기본 형식인 audioDevice 으로 설정됩니다.
[override virtual noexcept] QAudioSource::~QAudioSource()
이 오디오 입력을 삭제합니다.
qsizetype QAudioSource::bufferFrameCount() const
오디오 버퍼 크기를 프레임 단위로 반환합니다.
start() 이전에 호출되면 플랫폼 기본값을 반환합니다. start() 이전에 setBufferSize() 또는 setBufferFrameCount() 가 호출된 경우 setBufferSize() 또는 setBufferFrameCount() 에서 설정한 값을 반환합니다. start() 이후에 호출된 경우 사용 중인 실제 버퍼 크기를 반환합니다. 이 값은 setBufferSize() 또는 setBufferFrameCount() 에서 이전에 설정한 값과 다를 수 있습니다.
setBufferFrameCount() 및 bufferSize도 참조하세요 .
[since 6.10] qsizetype QAudioSource::bufferSize() const
오디오 버퍼 크기를 바이트 단위로 반환합니다.
start() 이전에 호출되면 플랫폼 기본값을 반환합니다. start() 이전에 setBufferSize() 또는 setBufferFrameCount() 가 호출된 경우 setBufferSize() 또는 setBufferFrameCount() 에서 설정한 값을 반환합니다. start() 이후에 호출된 경우 사용 중인 실제 버퍼 크기를 반환합니다. 이 값은 이전에 setBufferSize() 또는 setBufferFrameCount() 에서 설정한 것과 다를 수 있습니다.
이 함수는 Qt 6.10에 도입되었습니다.
setBufferSize() 와 bufferFrameCount도 참조하십시오 .
qsizetype QAudioSource::bytesAvailable() const
읽을 수 있는 오디오 데이터의 양을 바이트 단위로 반환합니다.
참고: 반환된 값은 QtAudio::ActiveState 또는 QtAudio::IdleState 상태일 때만 유효하며, 그렇지 않으면 0을 반환합니다.
framesAvailable도 참조하세요 .
qint64 QAudioSource::elapsedUSecs() const
유휴 및 일시 중단 상태의 시간을 포함하여 start()가 호출된 이후의 마이크로초를 반환합니다.
QtAudio::Error QAudioSource::error() const
오류 상태를 반환합니다.
QAudioFormat QAudioSource::format() const
사용 중인 QAudioFormat 을 반환합니다.
[since 6.10] qsizetype QAudioSource::framesAvailable() const
프레임 단위로 읽을 수 있는 오디오 데이터의 양을 반환합니다.
참고: 반환된 값은 QtAudio::ActiveState 또는 QtAudio::IdleState 상태일 때만 유효하며, 그렇지 않으면 0을 반환합니다.
이 함수는 Qt 6.10에 도입되었습니다.
bytesAvailable 를참조하세요 .
bool QAudioSource::isNull() const
오디오 소스가 null 인 경우 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.
qint64 QAudioSource::processedUSecs() const
start()가 호출된 이후 처리된 오디오 데이터의 양을 마이크로초 단위로 반환합니다.
void QAudioSource::reset()
버퍼의 모든 오디오 데이터를 삭제하고 버퍼를 0으로 초기화합니다.
void QAudioSource::resume()
suspend() 이후 오디오 데이터 처리를 재개합니다.
state()를 suspend()가 호출되었을 때 싱크의 상태로 설정합니다. 오디오 싱크의 상태가 QtAudio::SuspendedState 이 아닌 경우 이 함수는 아무 작업도 수행하지 않습니다.
void QAudioSource::setBufferFrameCount(qsizetype value)
오디오 버퍼 크기를 프레임 수( value )로 설정합니다.
참고: 이 함수는 start() 이전에 언제든지 호출할 수 있습니다. start () 이후에는 이 함수에 대한 호출이 무시됩니다. 설정된 버퍼 크기가 실제 사용되는 버퍼 크기라고 가정해서는 안 되며, start() 이후에 언제든지 bufferFrameCount()를 호출하여 사용 중인 실제 버퍼 크기를 반환해야 합니다.
bufferFrameCount() 및 setBufferSize도 참조하세요 .
[since 6.10] void QAudioSource::setBufferSize(qsizetype value)
오디오 버퍼 크기를 value 바이트로 설정합니다.
참고: 이 함수는 start() 이전에 언제든지 호출할 수 있으며, start() 이후에는 호출이 무시됩니다. 설정된 버퍼 크기가 실제 사용되는 버퍼 크기라고 가정해서는 안 되며, start() 이후 언제든지 bufferSize()를 호출하면 사용 중인 실제 버퍼 크기가 반환됩니다.
이 함수는 Qt 6.10에 도입되었습니다.
bufferSize() 및 setBufferFrameCount 을참조하십시오 .
void QAudioSource::setVolume(qreal volume)
입력 볼륨을 volume 으로 설정합니다.
볼륨은 0.0 (무음)에서 1.0 (최대 볼륨)까지 선형적으로 조절됩니다. 이 범위를 벗어나는 값은 고정됩니다.
장치가 입력 볼륨 조정을 지원하지 않는 경우 volume 은 무시되고 입력 볼륨은 1.0으로 유지됩니다.
기본 볼륨은 1.0 입니다.
참고: 볼륨을 조정하면 글로벌 볼륨이 아니라 이 오디오 스트림의 볼륨이 변경됩니다.
volume()도 참조하세요 .
QIODevice *QAudioSource::start()
시스템의 오디오 입력에서 데이터를 전송하는 데 사용되는 내부 QIODevice 에 대한 포인터를 반환합니다. 장치가 이미 열려 있고 read()가 이 장치에서 직접 데이터를 읽을 수 있습니다.
참고: 스트림이 중지되거나 다른 스트림을 시작하면 포인터가 유효하지 않게 됩니다.
QAudioSource 가 시스템의 오디오 장치에 액세스할 수 있는 경우 state()는 QtAudio::IdleState, error()는 QtAudio::NoError 를 반환하고 stateChanged() 신호가 방출됩니다.
이 프로세스 중에 문제가 발생하면 error()는 QtAudio::OpenError, state()는 QtAudio::StoppedState 을 반환하고 stateChanged() 신호가 전송됩니다.
QIODevice 및 QIODevice interface 을참조하세요 .
[since 6.11] template <typename Callback, QtAudio::if_audio_source_callback<Callback> = true> void QAudioSource::start(Callback &&cb)
소프트-실시간 오디오 스레드에서 호출될 콜백 함수로 QAudioSource 을 시작합니다. 콜백은 QSpan<const SampleType>을 인수로 받는 콜러블이며, SampleType은 QAudioSource 의 형식 중 QAudioFormat::SampleFormat 과 일치해야 합니다. 스팬에는 인터리빙된 오디오 데이터가 포함됩니다.
QAudioSource 를 성공적으로 시작할 수 있으면 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 QAudioSource::start(QIODevice *device)
시스템의 오디오 입력에서 device 로 오디오 데이터 전송을 시작합니다. device 은 WriteOnly, Append 또는 ReadWrite 모드에서 열려 있어야 합니다.
QAudioSource 에서 오디오 데이터를 성공적으로 가져올 수 있으면 state()은 QtAudio::ActiveState 또는 QtAudio::IdleState 을 반환하고, error()은 QtAudio::NoError 을 반환하며, stateChanged() 신호가 방출됩니다.
이 과정에서 문제가 발생하면 error()는 QtAudio::OpenError, state()는 QtAudio::StoppedState 을 반환하고 stateChanged() 신호가 전송됩니다.
QIODevice 및 QIODevice interface 을참조하세요 .
QtAudio::State QAudioSource::state() const
오디오 처리 상태를 반환합니다.
[signal] void QAudioSource::stateChanged(QtAudio::State state)
이 신호는 state 장치가 변경되었을 때 방출됩니다.
참고: QtAudio 네임스페이스의 이름은 Qt 6.6까지 QAudio였습니다. 이 신호에 대한 문자열 기반 연결은 매개변수 유형으로 QAudio::State 을 사용해야 합니다: connect(source, SIGNAL(stateChanged(QAudio::State)), ...);
void QAudioSource::stop()
오디오 입력을 중지하고 시스템 리소스에서 분리합니다.
error()를 QtAudio::NoError, state()를 QtAudio::StoppedState 으로 설정하고 stateChanged() 신호를 방출합니다.
void QAudioSource::suspend()
오디오 데이터 처리를 중지하여 버퍼링된 오디오 데이터를 보존합니다.
error()를 QtAudio::NoError, state()를 QtAudio::SuspendedState 으로 설정하고 stateChanged() 신호를 방출합니다.
qreal QAudioSource::volume() const
입력 볼륨을 반환합니다.
장치가 입력 볼륨 조정을 지원하지 않는 경우 반환되는 값은 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.