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 は、2つの異なるモードで使用できます:
- アプリケーション・スレッドからQIODevice を使用する。
- オーディオスレッドからコールバックベースのインターフェイスを使用する。
QIODeviceインターフェース
QAudioSourceを使用すると、オーディオ入力デバイスでオーディオを録音できます。このクラスのデフォルトのコンストラクタはシステムのデフォルトのオーディオ・デバイスを使用しますが、特定のデバイスのQAudioDevice を指定することもできます。また、録音したいQAudioFormat 。
QAudioSourceの起動は、書き込み用にオープンされたQIODevice でstart ()を呼び出すだけです。例えば、ファイルに録音するには、次のようにします:
QFiledestinationFile;// クラス・メンバーQAudioSource* audio;// クラス・メンバー{ destinationFile.setFileName("/tmp/test.raw"); destinationFile.open() QIODevice::書き込み専用QIODevice::Truncate ); QAudioFormatformat;// 必要なフォーマットを設定する。例えば、format.setSampleRate(44100); format.setChannelCount(1); format.setSampleFormat(QAudioFormat::Int16); QAudioDeviceinfo=QMediaDevices::defaultAudioInput();if(!info.isFormatSupported(format)) { { info.isFormatSupported(フォーマット) qWarning() << "Default format not supported, trying to use the nearest."; } audio= newQAudioSource(format, this); connect(audio, &)::stateChanged,this,&AudioInputExample::handleStateChanged.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は、アクティブ、サスペンド、ストップ、アイドルの4つの状態のうちの1つになります。これらの状態は、QtAudio::State enumによって指定されます。
QAudioSourceは、録音のstart()からの経過時間を測定する方法をいくつか提供しています。processedUSecs() 関数は、ストリームの長さをマイクロ秒単位で返します。elapsedUSecs ()関数は、QAudioSourceがどの状態にあったかにかかわらず、start ()が呼び出されてからの経過時間を返します。
スレッドモデルとバッファリング
QIODevice インターフェースは、アプリケーション・スレッドから使用されるように設計されています。オーディオ・スレッドとの通信には、待ち時間のないリング・バッファが使用されます。このリングバッファのサイズはsetBufferSize() で設定でき、デフォルトは 250ms です。このバッファの状態はbytesFree()で問い合わせることができる。アプリケーションがQIODevice から時間内に読み込まなかったためにリングバッファがいっぱいになった場合、状態はQtAudio::IdleState に変更され、アプリケーションがQIODevice からデータを読み込むとQtAudio::ActiveState に再開されます。この状態変更によってオーディオデータがドロップアウトするので、ドロップアウトを避けるために、常にQIODevice からできるだけ速く読み込む必要があることに注意してください。
コールバック・インターフェース
低オーディオレイテンシを実現するために推奨される方法は、コールバックベースのインターフェイスを使用することです。これにより、QIODevice を介さずに、オーディオデバイスから直接オーディオデータを読み込むことができます。これは、オーディオスレッドから呼び出されるコールバック関数でstart() を呼び出すことで行われます。このコールバック関数は、オーディオバックエンドがデータを生成するたびに、QSpan<const SampleType> で呼び出されます。
QAudioSource* std::atomic<float>peakLevel;// クラスメンバ。 QAudioFormatformat;// フォーマットの設定、例えばformat.setSampleRate(44100); format.setChannelCount(2); format.setSampleFormat(QAudioFormat::Float); QAudioDeviceinfo(QMediaDevices::defaultAudioOutput());if(!info.isFormatSupported(format)) { { { フォーマットを設定します。 qWarning() << "Raw audio format not supported by backend, cannot capture audio."; return; } audio= newQAudioSource(format, this); audio->start([&peakLevel](QSpan<float>interleavedAudioBuffer) {floatlevel=peakLevel.load();for(floatsample : interleavedAudioBuffer) {// オーディオサンプルからピークレベルを計算level=std::max(level,std::abs(sample)); } peakLevel.store(level);// 注意:アプリケーションスレッドに通知する必要がある場合は注意が必要です 。 // 良いオプションは、autoreset events (windows)、eventfd (linux)、または macos の kqueue/EVFILT_USER です。});if(!audio->error()== QtAudio::Error::NoError) {// 他の start() シグネチャに加えて、 バックエンドがコールバックベースの IO を実装していない 場合 // * バックエンドがコールバックベースの IO を実装していない 場合 (API はすべての主要な // プラットフォームで 利用可能です ) // * オーディオコールバックのシグネチャが format.sampleFormat() と一致しない 場合、オーディオコールバックの開始は失敗します 。 qWarning() << "Error starting audio output:" << audio->errorString(); } }
QIODevice-ベースのインターフェースとは異なり、QAudioSourceはactive、suspend、stoppedの状態のみにすることができる。コールバックを使用する場合、setBufferSize() APIは使用できません。コールバックの引数のサイズは、オーディオ・バックエンドによって決定されます。
注: このAPIは、コールバックAPIをサポートするプラットフォームでのみ利用可能です:AppleのCoreAudio(macOS、iOSなど)、Windows、Linux(PulseAudioまたはPipeWireバックエンドを使用)、Androidです。
注意: コールバックはソフトリアルタイムオーディオスレッドで呼び出されます。コールバックがブロックされないようにすることが重要です。これは、オーディオのグリッチやドロップアウトを引き起こす可能性があるからです。これには、ブロッキングIOの実行、ミューテックスのロック、メモリの割り当て、その他ブロックする可能性のある操作が含まれます。ベストプラクティスについては、Ross Bencinaの記事Real-time audio programming 101: time waits for nothing を参照してください。また、オーディオコールバックを検証するためにclangのリアルタイムサニタイザーを使うことを検討してください。
ステートとエラーハンドリング
状態の変更は、stateChanged()シグナルを通して報告される。suspend(),resume(),stop(),reset(),start() を通して、直接状態変更を要求することができる。
エラーが発生した場合、QAudioSourceはStoppedState 。error type はerror() 関数で取得できます。報告される可能性のあるエラーの説明については、QtAudio::Error enumを参照してください。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 がdefault-initializedの場合、フォーマットはオーディオデバイスの優先フォーマットに設定される。
[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 の状態の間のみ有効で、それ以外の場合はゼロを返す。
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 の状態の時のみ有効です。それ以外の場合はゼロを返します。
この関数は Qt 6.10 で導入されました。
bytesAvailableも参照してください 。
bool QAudioSource::isNull() const
音源がnull の場合はtrue を返し、そうでない場合はfalse を返す。
qint64 QAudioSource::processedUSecs() const
start() が呼び出されてから処理された音声データの量をマイクロ秒単位で返す。
void QAudioSource::reset()
バッファ内のすべてのオーディオデータを削除し、バッファをゼロにリセットする。
void QAudioSource::resume()
suspend() の後にオーディオ・データの処理を再開する。
suspend() が呼び出されたときのシンクの状態をstate() に設定する。オーディオ・シンクの状態が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> を引数に取る callable である。SampleType は、QAudioSource's format のQAudioFormat::SampleFormat と一致しなければならない。Spanはインターリーブされたオーディオデータを含む。
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の記事Real-time audio programming 101: time waits for nothing を参照してください。また、オーディオコールバックを検証するために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.