そこで、マルチプラットフォームで使えるライブラリとして、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 件のコメント:
コメントを投稿