ESP @Wiki

P-FAAC1

最終更新:

匿名ユーザー

- view
メンバー限定 登録/ログイン

How to use libfaac


libfaac概要


open


libfaacコーデックをオープンするのに必要な情報は、入力音声のサンプリングレートと音声のチャンネル数(ステレオなら2)である。また、オープンするときにセットされる、コーデックが扱うサンプル数 (maxInputSamples)も後々重要になってくる。

_hEncoder = faacEncOpen(sampleRate,  // 入力音声のサンプルレート
                        numChannels, // 入力音声のチャンネル数
                        &maxInputSamples, // コーデックに入力可能な最大サンプル数
                        &maxOutputBytes); // なんだっけ

入力可能サンプル数


エンコードを行う前に理解しておかなければならない固有の制限がある。それは、一度にエンコードできるサンプル数に上限があるという決まりである。ちょうど映像が720x480ピクセルで1枚と同じような概念だ。

この入力可能サンプル数は、faacEncOpen()で、第3引数ポインタにセットされた数が上限である。この制限を超えた場合どうなるか?最大を超えるのであるから、超えた分のサンプル、つまり音声データが欠落する。

mpeg1 layer2などの音声では、デコードすると簡単にこの最大値を超えるため特殊な処理が必要となる。つまり、マックスサンプル数を入力し、溢れた分はキューなどで処理をし、次回のエンコードの時にうまくハンドルする必要がある。

ポイントは、最大サンプル数と、FIFOバッファリングだ。

encode


libx264のエンコードとは異なり、コーデックのエンコード関数を1回呼び出すことで1フレーム分のエンコードが完結する。入力されるサンプル数を第3引数で指定することができるが、うまくいかない。(というかそのせいでLPCMのデコードができなかった)

そこで、この値は常に2048のmaxInputSamplesに指定することで(当然FIFOの実装が必要)、不慮の問題を回避することをお勧めする。

bytesWritten = faacEncEncode(_hEncoder,
                             inputWaveRawData,
                             inputSamples,
                             encodedData,
                             maxInputSamples);


mp4 header


libfaacを利用して得られたAAC音声データをMP4コンテナに格納するためには、映像と同様にヘッダ情報をMP4ファイルに書き込む必要がある。libfaac(AAC)のこの情報は、ASCと呼ばれる。MP4ファイルに書き込む際に必要となる情報は、このASCとASC配列の長さの2つである。

通常このASC情報は、libfaacが提供する関数で得ることが出来る。


unsigned char* asc; //ASC情報が書き込まれる(malloc必要なし)
int ascLength;          //ASC情報が何バイトかが書き込まれる

faacEncGetDecoderSpecificInfo(hEncoder,
                                                &asc,
                                                &ascLength);



quality setting


とりあえず、
 cfgEncoder->mpegVersion   = MPEG4; // MPEG4形式
 cfgEncoder->aacObjectType = LOW;   // Low Comp
 cfgEncoder->allowMidside  = 0;     // 1にするとおかしな結果になる