gstreamer-sdkの導入および、SSHによる音声の転送

もうそろそろ、自作アプリで音を出す方法を確保しようと考えました。
そこで、マルチプラットフォームで使えるライブラリとして、GStreamerを試しました。
環境はUbuntu 13.04 amd64です。

GStreamerチュートリアル・サンプルプログラムの実行の様子

マルチプラットフォームなサウンドライブラリの選択肢としては、他にlibaoやOpenAL Softなどがあるようです。

SDKの導入とサンプルソースを実行するまで

まずはGstreamerの公式ページから、DownloadSDK->Linuxと移動し、ドキュメントまで飛びます。


ドキュメントに書いてある方法で、SDKを導入します。
リンク先から gstreamer-sdk.list を入手したら、コマンド操作でSDKをリポジトリに追加します。
(FireFoxで試しましたが、右クリックで「リンク先をダウンロード」しなければいけませんでした)。

sudo cp gstreamer-sdk.list /etc/apt/sources.list.d/

wget -q -O - http://www.freedesktop.org/software/gstreamer-sdk/sdk.gpg | sudo apt-key add -
sudo apt-get update


sudo apt-get install gstreamer-sdk-dev


インストール後に、 /opt/gstreamer-sdk/bin/gst-sdk-shell  を実行するように書いてあります。これはどうやらパスなどをターミナルに設定するシェルスクリプトのようです。

設定したら、シェル上でpkg-configの出力を確認しました。
pkg-config --cflags --libs gstreamer-0.10
実行結果 (私の環境の場合)
-pthread -I/opt/gstreamer-sdk/include/gstreamer-0.10 -I/opt/gstreamer-sdk/include/glib-2.0 -I/opt/gstreamer-sdk/lib/glib-2.0/include -I/opt/gstreamer-sdk/include/libxml2  -pthread -L/opt/gstreamer-sdk/lib -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lxml2 -lglib-2.0 

Gitにてチュートリアルをダウンロードします。
git clone git://anongit.freedesktop.org/gstreamer-sdk/gst-sdk-tutorials

チュートリアルのソースが入っているディレクトリまで移動します。
cd gst-sdk-tutorials/gst-sdk/tutorials/

ベーシックチュートリアル1のコンパイル
gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-0.10`

チュートリアルを実行します。
./basic-tutorial-1

実行に成功すると、SINTELのプロモーションが再生されます。


あとは付属するツールのソースを見るか、GStreamer アプリケーション開発マニュアル 日本語訳などで使い方を学んでいこうかと思います。

aptで入手した場合、ファイルの配置場所は /opt/gstreamer-sdk/bin/
の下です。
これらについては、さらにGStreamerのソースをGitリポジトリから入手してソースを読みます。
 ソースはGStreamerリポジトリの、
 gstreamer/tools/
の下に存在します。
(GStreamerのソースをライブラリやプラグインを含む状態で、まとめてダウンロードできるリポジトリが見つけられませんでした。目的のプログラムソースは本体に含まれていたのでまあ良いのですが。)



GStreamerライブラリのビルド方法

ビルドに足りないアプリケーションを導入します。
(足りないパッケージは次のautogen.shが警告してくれます。)
sudo apt-get install libbison-dev flex -y

makeの前準備を行います。
このスクリプトが、Gitリポジトリから自動でgstreamer/commonのソースを取得します。
(今回はインストール先に、ソースディレクトリの一つ上のディレクトリを指定しています。)
./autogen.sh --prefix=$(basename $(pwd))

ビルドを実行します。
make
make install

以上で、GStreamer本体のビルドは終了です。
本体の標準機能は少ないようで、使用可能なエレメントがほとんどありません。
autoaudiosrcすら見つかりません。
特に理由がない限り、公式が配布しているバイナリを使ったほうが良さそうです。


ネットワーク越しのサウンド転送方法

マイクの使い方を gst-inspectを使った音声入力の取得 から、
音声の転送を動画の転送gst-launchを使ったネットワーク転送 から、それぞれ参考にさせていただきました。


事前にツールの配置されたディレクトリへ移動(cd /opt/gstreamer-sdk/bin)しておきます。

まずマイク入力で音声が取れることを確認します。
入力エレメントの存在を確認。
./gst-inspect-0.10 | grep audiosrc
autodetect:  autoaudiosrc: Auto audio source

マイク音声をそのまま出力します。
 ./gst-launch-0.10 autoaudiosrc ! autoaudiosink

送信・受信でシェルを2つ立てる必要があります。

受信側に受信サーバを立てます。
./gst-launch-0.10 tcpserversrc host=localhost port=53000 ! gdpdepay ! autoaudiosink

送信側で送信クライアントを実行します。
./gst-launch-0.10 autoaudiosrc ! gdppay ! tcpclientsink host=localhost port=53000


サーバ・クライアントは入れ替えることもできます。
(先にサーバを立ててからクライアントを実行しないと、クライアントは「〜への接続が拒否されました」として失敗終了します。)


sshポートフォワーディングを通したサウンド転送

sshポートフォワーディングを経由したサウンド再生をテストしようと思います。
メインで使っているユーザに一時的でもログイン可能にするのは怖いので、SSHのログイン方向は、main側からsshuser側、とします。
なお、SSHユーザの設定は、SSHライブラリをビルドしてみた記事の環境を、ほぼそのまま使用しています。


sshクライアント側で扱いやすいよう、今回は、音声ソースにマイクではなくOggの音楽ファイルを使用します。

Oggファイルの再生

前準備として、Oggファイルが再生できることを確認します。
./gst-launch-0.10 filesrc location="/home/sshuser/07 - Automatic analyzer.ogg" ! oggdemux ! vorbisdec ! autoaudiosink


ネットワーク経由のサウンド再生

ネットワークを経由でファイルが再生できることも確認しておきます。
sshでログインされる側のユーザ(以下sshuser)は音声出力できません。
sshuser側から、現在のユーザ(以下main側)へサウンドを送出することにします。

受信側(main側)で受信サーバを立てます。
./gst-launch-0.10 tcpserversrc host=localhost port=53000 ! gdpdepay ! autoaudiosink

送信側(sshuser側)で送信クライアントを実行します
./gst-launch-0.10 filesrc location="/home/sshuser/07 - Automatic analyzer.ogg" ! oggdemux ! vorbisdec ! gdppay ! tcpclientsink host=localhost port=53000

SSHトンネルの作成とサウンド転送

SSHトンネルを作ります。
前述の通り、SSHのログイン方向は、main側からsshuser側、とします。

sshuserに仕込んだ鍵のid_rsa.pubを取得して、main側からログインできることを確認します。
ssh sshuser@localhost


ログインが確認できたらログアウトして、あらためてSSHトンネルを作成します。
ssh -L  54000:localhost:54001 sshuser@localhost

受信側(mainユーザ)で受信サーバを実行します。
./gst-launch-0.10 tcpserversrc host=localhost port=54001 ! gdpdepay ! autoaudiosink

送信側(sshtestユーザ)のシェルで送信クライアントを実行します。
./gst-launch-0.10 filesrc location="/home/sshuser/07 - Automatic analyzer.ogg" ! oggdemux ! vorbisdec ! gdppay ! tcpclientsink host=localhost port=54000



以上の手順が上手く行っていれば、再生したOgg音楽ファイルが聴けるはずです。

このブログの人気の投稿

GIMP2.8でイラストにペン入れを行う

squid3プロキシサーバの設定(Ubuntu13.10)

Ubuntu13.04で使える動画編集ソフト一覧