オーディオサンプルとサウンドレベル

この例では、マイクサンプルとオーディオレベルの描画を示します。

この例の実装はウィジェットに基づいています。詳しくは Qt Widgets でプログラミングを始めるを参照してください。以下のセクションでは、Qt Charts API を使用して、サンプル対サウンドレベルのグラフにダイナミックデータを表示する方法について説明します。サンプリングの詳細については、Sampling_(signal_processing)を参照してください。

サンプルを実行する

サンプルを実行するには Qt Creatorからサンプルを実行するには、Welcome モードを開き、Examples からサンプルを選択します。詳しくは、Building and Running an Example をご覧ください。

オーディオデータの取得

main.cppQt Multimedia モジュールが含まれているおかげで、ターゲット・プラットフォームのデフォルト・ オーディオ・デバイスを表す新しいQAudioDevice を作成できます。また、オーディオ入力デバイスがあるかどうかをチェックし、利用可能な入力オーディオデバイスがない場合はユーザーに知らせます。

    if (inputDevice.isNull()) {
        QMessageBox::warning(nullptr, "audio",
                             "There is no audio input device available.");
        return -1;
    }

オーディオデバイスは、コンストラクタの引数w を使ってウィジェットw に渡されます。その後、w.show() が呼び出され、ウィジェットが表示されます。

    Widget w(inputDevice);
    w.resize(800, 600);
    w.show();

チャートの設定

このセクションでは、チャートと軸のセットアップについて説明します。

widget.cpp では、再実装された Widget コンストラクタが、アプリケーションのロジックに関して重い仕事をします。QChart,QLineSeries,QChartView オブジェクトは以下のように宣言されています:

    : QWidget(parent)
    , m_chart(new QChart)
    , m_series(new QLineSeries)
{
    auto chartView = new QChartView(m_chart);
    m_chart->addSeries(m_series);

m_seriesは、オーディオ入力データを使用するためのものです。

X軸の "サンプル"

x 軸の最小値から最大値までの範囲を 0 から XYSeriesIODevice::sampleCount に設定します。(xyseriesiodevice.hでは2000として宣言されている)。次にタイトルテキストを設定します。

    auto axisX = new QValueAxis;
    axisX->setRange(0, XYSeriesIODevice::sampleCount);
    axisX->setLabelFormat("%g");
    axisX->setTitleText("Samples");
Y軸の "Audio Level"

QValueAxis axisY を作成し、その範囲とタイトルテキストを設定します。

    auto axisY = new QValueAxis;
    axisY->setRange(-1, 1);
    axisY->setTitleText("Audio level");
軸の取り付けとグラフ・タイトルの設定

軸を取り付け、凡例を非表示にし、チャートのタイトルにオーディオ入力として使用されているマイクの名前を設定します。

    m_chart->addAxis(axisX, Qt::AlignBottom);
    m_series->attachAxis(axisX);
    m_chart->addAxis(axisY, Qt::AlignLeft);
    m_series->attachAxis(axisY);
    m_chart->legend()->hide();
グラフのレイアウト

ここでは、QVBoxLayout mainLayout を使い、QChartviewchartView を垂直レイアウトに追加します。

    m_chart->setTitle("Data from the microphone (" + deviceInfo.description() + ')');

    auto mainLayout = new QVBoxLayout(this);

音声入力データの使用

このセクションでは、マイクのデータをQLineSeries m_series に渡す方法を示します。前回と同様、これはQt Multimedia モジュールに依存しています。

まず、QAudioInput コンストラクタに deviceInfo を渡します。

    mainLayout->addWidget(chartView);

    m_audioInput = new QAudioInput(deviceInfo, this);

    QAudioFormat formatAudio;

次に、QAudioFormat formatAudio のチャンネル数、サンプル・レート、サンプル・フォーマットを設定します。

    formatAudio.setSampleRate(8000);
    formatAudio.setChannelCount(1);

QAudioSource を作成し、そのバッファサイズを設定します。

    formatAudio.setSampleFormat(QAudioFormat::UInt8);

    m_audioSource = new QAudioSource(deviceInfo, formatAudio);

さて、いよいよデータをチャートに貼り付けます。そのためにXYSeriesIODeviceクラスを作成しました。実装方法はXYSeriesIODeviceを参照してください。

    m_audioSource->setBufferSize(200);

    m_device = new XYSeriesIODevice(m_series, this);
    m_device->open(QIODevice::WriteOnly);
XYSeriesIODevice

xyseriesiodevice.cpp で実装された XYSeriesIODevice は、信号のサンプリングを行います。writeData 関数は、分解能を 4 に固定し、サンプルカウントに基づいてQList m_buffer のサイズを設定し、x 値の増分と y 値を 0 に設定した QPointF で埋めます。

{
    static const int resolution = 4;

    if (m_buffer.isEmpty()) {
        m_buffer.reserve(sampleCount);
        for (int i = 0; i < sampleCount; ++i)
            m_buffer.append(QPointF(i, 0));
    }

    int start = 0;

それからサンプリングを行う。

    const int availableSamples = int(maxSize) / resolution;
    if (availableSamples < sampleCount) {
        start = sampleCount - availableSamples;
        for (int s = 0; s < start; ++s)
            m_buffer[s].setY(m_buffer.at(s + availableSamples).y());
    }

    for (int s = start; s < sampleCount; ++s, data += resolution)
        m_buffer[s].setY(qreal(uchar(*data) -128) / qreal(128));

    m_series->replace(m_buffer);
    return (sampleCount - start) * resolution;

プロジェクト例 @ code.qt.io

© 2025 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.