libvorbisで.ogg音声ファイルをデコードする(memo)

vorbis形式の音声ファイルを再生するコードを書こうと思った際のメモです。
勿体なかったので公開。
書いたのは、vorbisをPCMデータに変換するまでです。
音を出していないので、正しさを確認していない&中途半端です。

PCM形式でメモリに置くまで試して、PCMデータのサウンド出力は実際に試さずに放置していました。

さらに、同じ内容で微妙に違う2記事を適当に統合したので、重複や間違いがあると思われます。


Gstreamer


libvorbisで、(ogg) vorbisファイルをデコードしてメモリ上にPCMデータを作るサンプル
Gstreamerで 、メモリ上のPCMデータを出力するサンプル
を組み合わせて、
Ogg VorbisファイルをPCMデータにしてからGStreamerに投げることを目指す

こんなことをしなくても、
GStreamerにファイルを渡せばOggVorbisのデコードまでしてくれるが。

わざわざこんなことをする理由は、
・Ogg Vorbisファイルがデコードできていることを確認したい。
・ネットワーク音声転送するにあたって、GStreamerにメモリ上の音声データを直接渡す方法を知っておきたい。

ネットワークを通すということは、ストリームでありバイナリデータ。
GStreamerにも音声伝送用のサーバ・クライアントはあるが、暗号化をかけるのが面倒そう&画像と音声以外を送るためにできていない。





PCM形式が使われるらしい。
(libvorbisもデコード時にPCM変換を行っている)

メモリ上にPCMデータを用意する
Gstreamerにメモリを読ませる。
Gstreamer内部形式に変換させる
出力まではGstreamr

なお、GStreamerの出力デバイス自動指定(autoplay)を使うので、これを指定して音が出ることが前提です。




(とても成功とは思えない) libvorbisサンプルプログラム実行成功の様子

libvorbis(libogg)とサンプルのコンパイル

ソースを入手するには、公式サイト http://www.xiph.org/downloads/ から圧縮ファイルかリポジトリを探します。
今回はGitリポジトリを使用しました。
公式サイトには、さらにサンプルコードとその解説が用意されています。

どなたかが日本語訳してくださったFAQによると、libvorbisを使用するには、liboggが必要とのこと。

ライブラリソースのダウンロードページからリポジトリ一覧を探し、その中からliboggとlibvorbisをcloneして取得しました。
ダウンロードページの圧縮ファイルを解凍して使っても構いません。

作業用のディレクトリを作り、その中でgitコマンドを実行しました。

git clone  git://git.xiph.org/mirrors/ogg.git
git clone git://git.xiph.org/mirrors/vorbis.git

libvorbisはliboggを必要とするので、oggからコンパイルします。
また、今回はインストール場所をプロジェクトディレクトリ下にするため、prefixオプションを使用しています。

cd ogg
./autogen.sh --prefix=$(dirname $(pwd))
make install
cd ..


続いてlibvorbisをコンパイルします。
(インストール先にすでにliboggのバイナリがあるためか、オプションでlibogg指定する必要はありません。)

cd vorbis
./autogen.sh --prefix=$(dirname $(pwd))
make install
cd ..

公式サイトにあるlibvorbisのドキュメント内にサンプルソースがあるので、コピーして使用します。
ファイル名をexample.cとして保存します。


makefileを書きます(必要箇所をtabで置き換えてください)。

BIN=vorbis.exe
SRC=example.c
ARGS=$(shell export PKG_CONFIG_PATH=lib/pkgconfig/:${PKG_CONFIG_PATH}; \
    pkg-config --libs --cflags vorbis vorbisfile)

$(BIN): makefile $(SRC)
    gcc $(SRC) -o $(BIN) $(ARGS)

clean:
    rm $(BIN)




ここまでの準備が済むと、作業ディレクトリはこのような構成になっているはずです。

 vorbis/        (libvorbisのソースディレクトリ)
 ogg/            (liboggのソースディレクトリ)
 include/
 lib/
 share/
 example.c            (プログラムソース)
 makefile


コンパイルして実行します。
デコードするoggファイルは、標準入力から与えます。
make
./vorbis.exe < "~/07 - Automatic analyzer.ogg"

シェル上に文字化けした謎の出力が出るようになったら成功です。
PCMデータを変換せずに標準出力に出力しているため、このような出力になります。

GStreamer-SDK導入とサンプルのコンパイル

以前の記事を参照してください。
チュートリアルをコンパイルして実行できるところまで確認しておくと良いです。


ここから先は、メモリ上のPCMデータを実際に再生する、そして解説がここに。
GStreamerは標準でoggファイルの再生機能を持っていますが、ここで重要なのは、メモリ上の生データ(PCM形式の配列データ)をGStreamerに流し込む方法と、それによるPCMデータの再生です。

spk121様のburro-engineより、
メモリ上のPCMビープ音をGstreamerで出力するサンプルを取得します。
さらに、GStreamerおよびこのコードについての解説が、GStreamer Tutorial #1: How I Made a Beep! にあります(英語)。

ビルド方法も、ソース付属のビルドスクリプトに準じます。



要するに、audio/x-raw-intを使って、PCMデータをGStreamerに流し込めば音が再生できるようです。




このブログの人気の投稿

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

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

ubuntu13.04で無線LANが繋がらない場合の対処