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音楽ファイルが聴けるはずです。

0 件のコメント:

コメントを投稿

Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換する

 Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換することができるが、上手く変換されない場合がある。   以前作った魔法陣イラスト素材をイラスト素材ストックサイトへ登録しようと思い立ち、改めて素材用にラスタライズ変換をかけようとした。   ラスタライズ変換...