GStreamer で音声を扱ってみる


はじめに
--------

ラズパイでのカメラストリーミングなどで注目されがちな GStreamer ですが、**マルチメディア**フレームワークということだけあって、音声に関する Element も豊富です。

なので今日はサックリと音声を扱う方法を紹介していきます

どのくらい豊富?
---------------

Windows では Audio decoder だけでも 30 Elements もあります。
ちなみに、rasbian で使える Audio decoder は 29 Elements ありました。

```shell-session
$ gst-inspect-1.0 | grep audio | grep decoder
wavpack:  wavpackdec: Wavpack audio decoder
vorbis:  vorbisdec: Vorbis audio decoder
speex:  speexdec: Speex audio decoder
opus:  opusdec: Opus audio decoder
mulaw:  mulawdec: Mu Law audio decoder
mpg123:  mpg123audiodec: mpg123 mp3 decoder
libav:  avdec_vima: libav LucasArts VIMA audio decoder
libav:  avdec_adpcm_vima: libav LucasArts VIMA audio decoder
libav:  avdec_vmdaudio: libav Sierra VMD audio decoder
libav:  avdec_smackaud: libav Smacker audio decoder
libav:  avdec_paf_audio: libav Amazing Studio Packed Animation File Audio decoder
libav:  avdec_mp3adufloat: libav ADU (Application Data Unit) MP3 (MPEG audio layer 3) decoder
libav:  avdec_mp3adu: libav ADU (Application Data Unit) MP3 (MPEG audio layer 3) decoder
libav:  avdec_mp3float: libav MP3 (MPEG audio layer 3) decoder
libav:  avdec_mp3: libav MP3 (MPEG audio layer 3) decoder
libav:  avdec_mp2float: libav MP2 (MPEG audio layer 2) decoder
libav:  avdec_mp1float: libav MP1 (MPEG audio layer 1) decoder
libav:  avdec_dsicinaudio: libav Delphine Software International CIN audio decoder
libav:  avdec_bmv_audio: libav Discworld II BMV audio decoder
libav:  avdec_binkaudio_rdft: libav Bink Audio (RDFT) decoder
libav:  avdec_binkaudio_dct: libav Bink Audio (DCT) decoder
ivorbisdec:  ivorbisdec: Vorbis audio decoder
gsm:  gsmdec: GSM audio decoder
flac:  flacdec: FLAC audio decoder
faad:  faad: AAC audio decoder
dtsdec:  dtsdec: DTS audio decoder
amrwbdec:  amrwbdec: AMR-WB audio decoder
amrnb:  amrnbdec: AMR-NB audio decoder
alaw:  alawdec: A Law audio decoder
a52dec:  a52dec: ATSC A/52 audio decoder
```

ざっと見ただけでも、手持ちのオーディオファイルはすべて鳴らせそうですね...

Description に `audio` が含まれているのは、なんと 158 Elements  :tada:

```shell-session
$ gst-inspect-1.0 | grep audio | wc -l
158
```

GStreamer を使うと何がうれしいの?
---------------------------------

おわかりの通り、対応している音声形式が豊富なんです。
これだけでも、音声ファイル変換のバックエンドに使えそうですよね。

また、こんなこと思った経験はありませんか?

- WMPは再生できる形式少ない...
- iTunesは起動遅い...
- そもそもGUIがじゃま

そんな人はこのパイプラインを使って

```shell-session
$ gst-launch-1.0 filesrc location=audio.mp3 ! decodebin ! audioconvert ! autoaudiosink
```

こうすれば幸せになれるかもしれませんね :)

```bash
while : do
  for file in `find`; do
    gst-launch-1.0 -q filesrc location=$file ! decodebin ! audioconvert ! autoaudiosink
  done
done
```

触って楽しかった Element を紹介
----------------------------------------

### カラオケ化

これで作業中にヒトカラできます

```shell-session
$ gst-launch-1.0 filesrc location=music.mp3 \
! decodebin !  audioconvert ! audiokaraoke ! autoaudiosink
```

### Low pass & high pass filter

ほかにもいくつか filter があるので inspect でプロパティを見て
設定して鳴らしてみると面白いです

```shell-session
$ gst-launch-1.0 filesrc location=music.mp3 \
! decodebin !  audioconvert ! audiowsinclimit cutoff=6000 \
! audioconvert ! autoaudiosink
```

### 音声の可視化

見た目だけ

```shell
$ gst-launch-1.0 filesrc location=music.mp3 \
! decodebin !  audioconvert ! wavescope ! autovideosink
```

音もいっしょに

```shell-session
$ gst-launch-1.0 filesrc location=music.mp3 \
! decodebin !  audioconvert ! tee name=t \
t. ! queue ! wavescope ! autovideosink \
t. ! queue ! autoaudiosink
```

wavescope でアルファブレンディングして、カメラ映像と合わせたら音声とカメラ映像の融合が!?

なんて妄想が膨らみます...

GStreamer な音楽プレイヤーを紹介
--------------------

こんなのがあるみたいです。(わたしは使ったことありません)

https://gmusicbrowser.org

ちなみに、arch 上で pacman を使ってインストールすると、
gst-libav がインストールされなくて alac 再生できないみたいなので、
alac 再生したい人は忘れずに gst-libav 入れてあげてくださいね

おわり
--------

いかがでしたか? 音声扱えそうじゃありませんか?

基本的に `decodebin ! audioconvert ! autoaudiosink` というやっつけだったのは許してやってください...

明日の投稿ですが、動画のエンコード・デコードについて書くつもりでした。

しかし、最近になって gst-typefind や gst-device-monitor の存在を知り「なんだこれ、なまら便利やん！」と思ったので、GStreamer ともっと仲良くするためのツールについて書きます笑

では、また明日。