September 2010 Archives

ogg on android

| No Comments | No TrackBacks

最近android上でもC#が使えるようになったので、試しにMoonVorbisのcsogg/csvorbisをベースに、android上で使えるようにしてみた。まだツールチェインのバグなどがあって、いろいろやっつけないとアプリがビルドできないのだけど、そのうちまともに使えるものが出るだろう。

そして、案の定パフォーマンスの面でAndroid上で非ネイティブコードはかなりきつそうだ。2,3秒のストリームをデコードするのに1分くらいかかっている。libmediaplayerserviceはmp3やoggを難なく再生できているのだから、Cであれば十分に実現可能であるはずだが、無駄な処理が多いのだろう。

ちなみに今回は、再生にはAudioTrackを使った。android上で合成オーディオを再生するにはこれを使うのが一般的だと思う。遅いのはどうやらAudioTrack以前なので(ストリーム出力が無くても遅い)、ここにOpenALをNDKでビルドしてインストールして使っても同じだろう。(変換のバッファサイズを小さくすると細切れに音が出るだけで、全体的に遅いことには変わりない。)

そんなわけで、多分oggをC#でループ再生させるプレイヤーは、androidでは作らないと思う。

無限ループogg player pt.2

| No Comments | No TrackBacks

とりあえず先日のfalcom-bgm-playerは、さすがにBGMの選択に難がありすぎるので、とりあえずちゃちなwinforms UIをつけてみた: falcom-bgm-player-dragonogg-20100906.zip

気が向いたらそのうち曲名リスト定義ファイルでも読んで選択できるようにしようと思う。それより曲の再生が詰まらないようにする必要がある気もしなくもない。しかし、どうせループで聴くものと割り切っていてあまり気にしていないというのが正直なところだ。あと、DragonOggはLGPLなので、csvorbisとプラットフォーム別のオーディオAPIで書き直したい(=DragonOggでいろいろいじっても無駄になりそう)ということもある。プラットフォーム別といってもandroid.mediaとportaudioくらいしか無いと思うけど(例によってiPhoneはまともにファイルが読めないので相手にするつもりはない)。

無限ループogg player

| No Comments | No TrackBacks

いろいろなことがあって...というほどでもないけど、しばらくここに書いていなかった。とりあえず直近の話としては、また開発機を修理することになってしまい、来週1週間をmacbookで過ごさなくてはならなくなってしまった。仕事できるかどうかも不明な状態なのだけど、とりあえずWindowsやLinuxで使用していたソフトはある程度シームレスに使えるようになりたい。

最近はwine 1.2がリリースされて、それなりにWindowsアプリケーションがMac上でも動くようになったのだけど、ひとつ動いてほしかったのが某falcomのゲームから取り出した音楽...と言っても生のoggファイルなのだけど...を再生するツールだ。ただ再生するだけならoggなのでVLCなどでも出来るのだけど、oggファイル中に含まれているLOOPSTART, LOOPLENGTHを読み取って、永久ループで聴けるようにしたい。意外とこのニーズを満たすソフトで、Macでもちゃんと動作するものが見つからない。

仕方ないので、自分でC#で作ることにした。本当は前々からcsvorbisを使って作ってはみたかったのだけど、先送りにしていた。いろいろなアプローチが考えられたのだけど、とりあえず手近に見つかったものに、DragonOggという、OpenTK.OpenALを使ったアリモノのプレイヤーライブラリがあった。というわけで、今回はとりあえずこれを改造したものだ。

falcom-bgm-player-dragonogg-20100904.zip

これはDragonOggにプレイヤーのプロジェクトを追加しただけなので、プログラム本体はfalcom-bgm-player/bin/Debug/falcom-bgm-player.exeということになる。まだ実験レベルなので、コマンドラインにファイル名を渡さないといけない、不親切なツールだ。

プレイヤーライブラリにはループを処理してくれる機構が無かったので、少し手を加えてやってみようとしたのだけど、まだこのライブラリのバッファ処理のクセがわからないので、「LOOPSTARTまでThread.Sleep()して、それからLOOPLENGTHだけThread.Sleep()する。終わったらLOOPSTARTにseekする」というたいへんやっつけ仕様の実装になっている。

これではシーク部分で音がブツ切れになったりして、時としてたいへん望ましくないのだけど、とりあえずバッファの終端まで再生したら元に戻るという仕組みが実現できていないので(書きながら気づいたのだけど、バッファの終端まで処理してはいけない気がする)、とりあえずは妥協実装だ。これにそんなに長時間かけるわけにはいかない。

そのうち自前でOpenALや他のプラットフォーム別のライブラリに統合してアプリケーションとして配布できるようにしようと思う。といってもローカルファイルが自由に読めないiPhoneは論外だけど。

About this Archive

This page is an archive of entries from September 2010 listed from newest to oldest.

August 2010 is the previous archive.

October 2010 is the next archive.

Find recent content on the main index or look in the archives to find all content.

Categories

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 4.23-en