このページでは

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
(since 6.10) qsizetype bufferFrameCount() const
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
(since 6.12) qsizetype nativePeriodFrameCount() const
qint64 processedUSecs() const
void reset()
void resume()
(since 6.10) void setBufferFrameCount(qsizetype value)
void setBufferSize(qsizetype value)
(since 6.12) void setNativePeriodFrameCount(qsizetype frameCount)
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()を呼び出すだけです。たとえば、ファイルに録音するには、次のようにします。

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 info=QMediaDevices::defaultAudioInput();
    if(!info.isFormatSupported(format)) {
        qWarning() << "Default format not supported, trying to use the nearest.";
    }

    audio= newQAudioSource(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は、いつでも「active」、「suspended」、「stopped」、または「idle」の4つの状態のいずれかにあります。これらの状態は、QtAudio::State 列挙型によって指定されます。

QAudioSource は、録音のstart() 以降に経過した時間を測定するいくつかの方法を提供しています。processedUSecs() 関数は、書き込まれたストリームの長さをマイクロ秒単位で返します。つまり、オーディオ入力が一時停止またはアイドル状態だった時間は除外されます。elapsedUSecs()関数は、QAudioSourceがどの状態にあったかに関係なく、start()が呼び出されてからの経過時間を返します。

スレッドモデルとバッファリング

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 info(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);
        // 注:アプリケーションスレッドへの通知が必要な場合は注意が必要です。
        // オーディオコールバックでは 、 ブロックする可能性のあるシステムコールを一切使用してはなりません。
       // 適切な選択肢としては、オートリセットイベント(Windows)、eventfd(Linux)、または macOS での kqueue/EVFILT_USER などがあります。
    });

    if(!audio->error()== QtAudio::Error::NoError) {
       // 他の start() のシグネチャに加え、以下の場合はオーディオコールバックの起動に失敗します。
        // * バックエンドがコールバックベースの I/O を実装していない場合(この API はすべての主要な
        //   プラットフォームで 利用可能です )
        // * オーディオコールバックのシグネチャが format.sampleFormat() と一致しない場合

        qWarning() << "Error starting audio output:" << audio->errorString();
    }
}

QIODevice ベースのインターフェースとは異なり、QAudioSource は active、suspended、stopped の状態のみをとることができます。コールバックを使用する場合、setBufferSize() API は利用できません。また、コールバック引数のサイズはオーディオバックエンドによって決定されます。

注:この APIは、 コールバックAPIをサポートするプラットフォーム(AppleのCoreAudio(macOS、iOSなど)、Windows、Linux(PulseAudioまたはPipeWireバックエンドを使用)、Android)でのみ利用可能です。

注:コールバックは 、ソフトリアルタイムのオーディオスレッド上で呼び出されます。コールバックがブロックしないようにすることが重要です。ブロックすると、オーディオのグリッチや音切れの原因となる可能性があります。これには、ブロックするI/Oの実行、ミューテックスのロック、メモリの割り当て、その他ブロックする可能性のある操作が含まれます。 ベストプラクティスについては、Ross Bencina氏の記事「Real-time audio programming 101: time waits for nothing」を参照してください。また、オーディオコールバックの検証には、clangのRealtime sanitizerの使用も検討してください。

状態とエラー処理

状態の変化は、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()

このオーディオ入力を破棄してください。

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

オーディオバッファのサイズをフレーム単位で返します。

start() の呼び出し前に呼び出された場合、プラットフォームのデフォルト値を返します。start() の呼び出し前に呼び出されたが、その前にsetBufferSize() またはsetBufferFrameCount() が呼び出されていた場合、setBufferSize() またはsetBufferFrameCount() で設定された値を返します。start() の呼び出し後に呼び出された場合、実際に使用されているバッファサイズを返します。これは、setBufferSize() またはsetBufferFrameCount() で以前に設定された値とは異なる場合があります。

この関数は Qt 6.10 で導入されました。

setBufferFrameCount() およびbufferSizeも参照してください 。

qsizetype QAudioSource::bufferSize() const

オーディオバッファのサイズ(バイト単位)を返します。

start() の呼び出し前に呼び出された場合、プラットフォームのデフォルト値を返します。start() の呼び出し前に呼び出され、かつsetBufferSize() またはsetBufferFrameCount() が先に呼び出されていた場合、setBufferSize() またはsetBufferFrameCount() で設定された値を返します。start() の呼び出し後に呼び出された場合、実際に使用されているバッファサイズを返します。これは、setBufferSize() またはsetBufferFrameCount() で以前に設定された値とは異なる場合があります。

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 の状態にある間のみ有効です。それ以外の場合はゼロを返します。

この関数はQt 6.10で導入されました。

bytesAvailableも参照してください 。

bool QAudioSource::isNull() const

オーディオソースが `null` の場合は `true ` を返し、それ以外の場合は `false` を返します。

[since 6.12] qsizetype QAudioSource::nativePeriodFrameCount() const

ネイティブの期間フレーム数を返します。

設定されていない場合は -1 を返し、それ以外の場合はsetNativePeriodFrameCount() で以前に設定された値を返します。

この関数は Qt 6.12 で導入されました。

setNativePeriodFrameCountも参照してください 。

qint64 QAudioSource::processedUSecs() const

start() の呼び出し以降に処理されたオーディオデータの量をマイクロ秒単位で返します。

void QAudioSource::reset()

バッファ内のすべてのオーディオデータを破棄し、バッファをゼロにリセットします。

void QAudioSource::resume()

suspend() の実行後に、オーディオデータの処理を再開します。

state() を、suspend() が呼び出された時点でのシンクの状態に設定します。オーディオシンクの状態がQtAudio::SuspendedState でない場合、この関数は何も行いません。

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

オーディオバッファのサイズを、フレーム数でvalue に設定します。

注:この関数は 、start() の呼び出し前であればいつでも呼び出すことができます。start() の呼び出し後は、この関数の呼び出しは無視されます。設定されたバッファサイズが実際に使用されているバッファサイズであると想定してはなりません。実際に使用されているバッファサイズを取得するには、start() の呼び出し後であればいつでもbufferFrameCount() を呼び出してください。

bufferFrameCount() およびbufferSize() プロパティは、QIODevice API を使用する際のリングバッファのサイズを表します。ネイティブの周期サイズは、setNativePeriodFrameCount() によって制御されます。

この関数は Qt 6.10 で導入されました。

bufferFrameCount() およびsetBufferSizeも参照してください 。

void QAudioSource::setBufferSize(qsizetype value)

オーディオバッファのサイズをvalue バイトに設定します。

注:この関数は 、start()が呼び出される前であればいつでも呼び出すことができますが、start()の呼び出し後は無視されます。設定されたバッファサイズが実際に使用されているバッファサイズであると想定すべきではありません。start()の呼び出し後にbufferSize()を呼び出すと、実際に使用されているバッファサイズが返されます。

bufferFrameCount() およびbufferSize() プロパティは、QIODevice API を使用する際のリングバッファサイズを示します。ネイティブの周期サイズは、setNativePeriodFrameCount() によって制御されます。

bufferSize() およびsetBufferFrameCountも参照してください 。

[since 6.12] void QAudioSource::setNativePeriodFrameCount(qsizetype frameCount)

ネイティブの周期フレーム数をframeCount に設定します。

オペレーティングシステムおよびハードウェアが使用するオーディオバッファサイズを調整します。デフォルト(設定されていない場合)では、システムはプラットフォームに依存する値(通常は1024フレーム、44100 Hzで約23 ms)を使用します。

レイテンシを低減するには小さい値(64~256)を、バッファオーバーラン(ドロップアウト)のリスクを低減するには大きい値(2048~4096)を使用します。

有効な値は、32 から 4096 までの 2 の冪(両端を含む)または、設定を解除する -1 です。オーディオソースが停止しているときにのみ呼び出すことができます。

プラットフォーム固有の設定への対応関係:kAudioDevicePropertyBufferFrameSize (macOS)、IAudioClient::bufferDuration (Windows)、PW_KEY_NODE_FORCE_QUANTUM (PipeWire/Linux)、AAudioStreamBuilder_setBufferCapacityInFrames (Android)。

注: これは 、setBufferSize() またはsetBufferFrameCount() で設定されるリングバッファとは別物です。

この関数は Qt 6.12 で導入されました。

nativePeriodFrameCountも参照してください 。

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> requires QtAudio::if_audio_source_callback<Callback> void QAudioSource::start(Callback &&cb)

QAudioSource を、ソフトリアルタイムオーディオスレッド上で呼び出されるコールバック関数とともに起動します。このコールバックは、QSpan<const SampleType>を引数として受け取るコールアブルです。SampleTypeは、QAudioSource のフォーマットで定義された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)でのみ利用可能です。

注:コールバックは 、ソフトリアルタイムのオーディオスレッド上で呼び出されます。コールバックがブロックしないようにすることが重要です。ブロックすると、オーディオのグリッチやドロップアウトの原因となる可能性があります。これには、ブロッキング I/O の実行、ミューテックスのロック、メモリの割り当て、その他ブロックする可能性のある操作が含まれます。 ベストプラクティスについては、Ross Bencina氏の記事「Real-time audio programming 101: time waits for nothing」を参照してください。また、オーディオコールバックの検証には、clangのRealtime sanitizerの使用も検討してください。

この関数は 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.