Qt Multimedia でやれる事＆実際に使ってみよう！！

# はじめに
メリークリスマス！！

5回目の投稿となります、HW 開発者の ynuma です。
簡単に近況を書かせていただきます。

お陰様で子供が無事成長し、もう少しで２歳となります。
魔の２歳児と伺っているので、びくびくしながら子育て中です。
本日はクリスマスですね。皆様はどのようにお過ごしでしょうか？
私は家族でのんびり過ごします。
子供のプレゼントはキッチンセットにしました。
この記事を公開する頃には、子供にプレゼントが渡り、喜んでいるのではないかと思います。

# 今回のテーマについて
本題になりますが、今回のテーマは Qt Multimedia についてです。
去年の続きで QtRuby の応用編にしようかと思いましたが、トレンドからちょっと外れていて実用性が乏しいのと、学生時代からの専門分野である音声処理に興味があったので、こちらのテーマにしようと思います。

皆様へのプレゼントになるとは思えませんが、少しでも参考になれば幸いです。

# Qt Multimedia
Qt Multimedia に馴染みのない方も多いかと思いますので、特徴などを簡単にまとめます。

ひと言でまとめるなら、クロスプラットホームでマルチメディア処理を行うためのAPIです。
もう少し具体的に言うと、Audio, Videoの再生・記録, Camera, Redio の制御を行うための共通インタフェースと言った感じになるかと思います。

また、Audio, Video のデータファイルをメモリに展開して、音声・画像処理を行う事にも活用できるようです。
この時点では、実際にどこまでやれるのか全てを理解しているわけではありませんが、解析好きな私には、spectrum というような単語が出て来る時点で興味が湧きました。

詳しくは、以下のページを参照ください。
https://doc.qt.io/qt-5.12/qtmultimedia-index.html

# History
今まで携わってきたわけではないので詳しくはわかりませんが、ちょっと調べた感じでは、Qt4.x 以降は確実に存在していたようです。
4.4 で multimedia support が強化されたようで、KDE の Phonon というフレームワークの API を採用したようです。
確かに、APIの中身は今のQtのものと同じような感じになっていました。
Qt 5.x からは、主に qtquick 対応が行われたようで、QML からも Qt Multimedia の API を呼び出せるようになっているようです。
これを Qt Quick Multimedia module と呼んでいるようですが、これらは商用ライセンスとなっているそうなので、注意が必要です。

# 音楽を鳴らすサンプルコード
なるべく短いコードで音楽を鳴らしてみようと思います。
[QMediaPlayer class][1] を使いました。
[1]:http://doc.qt.io/qt-5/qmediaplayer.html

```cpp:mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtMultimedia>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


private slots:
    void on_pushButton_clicked();

private:
    QMediaPlayer *player_;
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
```
```cpp:main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
```
```cpp:mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    player_ = new QMediaPlayer;
}

MainWindow::~MainWindow()
{
    delete ui;
    delete player_;
}

void MainWindow::on_pushButton_clicked()
{
    player_->setMedia(QUrl::fromLocalFile(ui->filePathLineEdit->text()));
    player_->setVolume(50);
    player_->play();
}
```

mainwindow.ui
![スクリーンショット 2018-12-24 3.39.49.png](https://qiita-image-store.s3.amazonaws.com/0/62136/bf50c66c-ec2a-7d52-3cee-20f754bd3a21.png)

Makefile に multimedia の記述も必要です。

QT       += core gui<span style="color: red; "> multimedia</span>


これらは、下記URLからもダウンロード可能です。
https://github.com/ynuma/QtAudioPlayer

# 実行方法
QLineEdit に再生したい音声ファイルを記述して、Play ボタンを押します。
フリー素材の音源も含んでいるので、試しに再生してみてください。
一応、クリスマスにちなんだ音源となっています。
![スクリーンショット 2018-12-24 5.03.39.png](https://qiita-image-store.s3.amazonaws.com/0/62136/de440f56-bf72-4d8d-eb18-d8bc7e0dff14.png)

Progress bar や、停止、早送り、早戻しなどを追加するなど、より本格的な Media Player を作ることもさほど難しくなさそうです。

# その他のAPIについて
今回はほんの一部の機能を使ってみましたが、実際にはとても便利なクラスが沢山存在します。
個人的に以下のクラスに興味があります。

QAudioBuffer class: audio data を扱うクラス
QVideoFrame class: video data を扱うクラス
QCamera class: カメラデバイスへの interface

詳細については、以下のページに説明があります。
http://doc.qt.io/qt-5/qtmultimedia-modules.html


# 終わりに
今回は multimedia class の概要を学びました。
次回以降、もう少し応用してみようと思います。

# 参考になった記事
[Qtでオーディオクラスを使う][2]
[2]:https://qiita.com/soramimi_jp/items/c2827e5f9d01c6efef36
[Qt Multimedia 5.12(Qt Documentation)][3]
[3]:https://doc.qt.io/qt-5.12/qtmultimedia-index.html