TheoraLib - WaveDecoder
目次
・概要
・theoralib_w_create
・theoralib_w_free
・theoralib_w_init
・theoralib_w_load
・theoralib_w_exists
・theoralib_w_decodesample
・theoralib_w_nowsample
・theoralib_w_totalsample
・theoralib_w_totaltime
・theoralib_w_info
・theoralib_w_comment
音声をデコードし、任意フレームの画像を取得するためのWaveDecoderクラスです。
とはいっても、DLL上でのものですから普通のクラスのようには扱えません。
DLL側の命令を使って、生成、使用、解放を制御します。
音声がないファイルでもこのクラスは使用(Load)できます。
ただし、チャンネル数は1(Mono)〜2(Stereo)の範囲しか扱えません。
function theoralib_w_create:Pointer; RESULT...WaveDecoderClassアドレス |
WaveDecoderクラスを生成し、アドレスを返します。
以後はこのアドレスを用いて操作を行います。
procedure theoralib_w_free( ptr:Pointer //WaveDecoderClassアドレス ); |
WaveDecoderクラスを解放します。
忘れずに。
procedure theoralib_w_init( ptr:Pointer //WaveDecoderClassアドレス ); |
初期化します。
Load前に戻します。
function theoralib_w_load( ptr:Pointer; //WaveDecoderClassアドレス datasource:Pointer; //データソースアドレス readfunc:Ttheoralib_cb_read; //データソースreadコールバック関数 sizefunc:Ttheoralib_cb_size; //データソースsizeコールバック関数 ):Integer; |
Theoraファイルを読み込みます。
この命令を行う前に「theoralib_m_load」と同じく、あらかじめデータソース対象となるストリームにファイルを読み込ませておく必要があります。
各種コールバック関数については「コールバック関数」を参照してください。
成功すると1、失敗すると0を返します。
データソースアドレスとコールバック関数は「MovieDecoder」クラスと同じものを共有することが可能です。
読み込みが行われると、ファイル全体のパケット情報を取得し、シーク情報を生成します。
読み込みにはそれなりの処理負荷と読み込み負荷がかかることに留意してください。
//TheoraMovieDecoder movie := theoralib_m_create; theoralib_m_setvrevers(movie,1); //上下反転 theoralib_m_load( movie, stream,cb_read,cb_size, //データストリームポインタとコールバック関数 bmp,cb_scanline,cb_resize, //ビットマップポインタとコールバック関数 nil //デコードコールバック関数。使用しないのでNULL ); //TheoraWaveDecoder wave := theoralib_w_create; theoralib_w_load( wave, stream,cb_read,cb_size //データをWaveDecoderと共有 ); |
水色の部分が、データソースの共有部分です。
function theoralib_w_exists( ptr:Pointer //WaveDecoderClassアドレス ):Integer; RESULT...0:なし / 1:あり |
音声情報があるかどうかを返します。
Theoraファイルに音声があるかどうかのチェックは、一度WaveDecoderでLoadさせて、このExists命令で取得してください。
function theoralib_w_decodesample( ptr:Pointer; //WaveDecoderClassアドレス buf:Pointer; //音声転送先アドレス offset:Integer; //開始オフセットサンプル数 size:Integer //取得サンプル数 ):Integer; RESULT...デコードしたサンプル数 |
指定サンプル位置から、指定の長さのサンプル数を、転送先アドレスにデコード・転送します。
サンプル数は内包されたフォーマットをそのまま返しますが、チャンネル数は2チャンネル(L/R)、精度は16Bit整数に強制変換されます。
よって常に、[L][R][L][R][L][R][L][R]…というデータの並びでbufに転送されます。
戻り値にはデコードされたサンプル数が返されます。size未満の場合は終端に達したということになります。
指定位置を後方に移動させたり、前方に大きく移動させると、内部でシーク処理が発生します。
シーク処理の負荷はそれなりに重い処理ですので、基本的には現在のデコード位置(nowsample)から進めるようにして、シークを極力減らすコードを書くようにしましょう。
nowpos = theora_w_nowsample(wave); theoralib_w_decodesample(wave,SoundBuffer,nowpos,1024*64); |
function theoralib_w_nowsample( ptr:Pointer //WaveDecoderClassアドレス ):Integer; RESULT...現在のサンプル位置 |
現在の処理サンプル位置を返します。
nowtimeはありませんので、TotalTimeとTitalSampleを使って計算してください。
function theoralib_w_totalsample( ptr:Pointer //WaveDecoderClassアドレス ):Integer; RESULT...トータルサンプル数 |
トータルサンプル数を返します。
function theoralib_w_totaltime( ptr:Pointer //WaveDecoderClassアドレス ):Integer; RESULT...トータルタイム(ms) |
トータルタイムを返します。
単位はミリ秒(ms)です。
あまり正確ではありません。
音声はサンプル数で扱うことが前提で設計されています。
MovieDecoderのTotalTimeとは異なる数値を返すようなので注意してください。
function theoralib_w_info( ptr:Pointer //WaveDecoderClassアドレス ):Pointer; RESULT...Ptheoralib_vorbisinfo (Ttheoralib_vorbisinfo構造体のアドレス) |
Vorbisインフォメーション情報の構造体のアドレスを返します。
以下のようにして情報を取得します。
var vi : Ptheoralib_vorbisinfo; begin vi := theoralib_w_info(wave); Memo1.Lines.Add(format('Rate %d',[vi.rate])); end; |
構造体についてはソースファイルを参照してください。
function theoralib_w_comment( ptr:Pointer //WaveDecoderClassアドレス ):Pointer; RESULT...Ptheoralib_vorbiscomment (Ttheoralib_vorbiscomment構造体のアドレス) |
Vorbisコメント情報の構造体のアドレスを返します。
theoralib_w_infoと同じようにアドレスを受け取ってください。
構造体についてはソースファイルを参照してください。