「P-FAAC1」(2006/03/26 (日) 13:27:25) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*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回呼び出すことでエンコードが簡潔される。
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にするとおかしな結果になる
*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にするとおかしな結果になる
表示オプション
横に並べて表示:
変化行の前後のみ表示: