ライブラリのインストール (aac)

3月 23rd, 2010

AAC (Advanced Audio Coding) はmp3などの旧世代の音声圧縮符号化方式を越える音質と圧縮率を目指して開発されました。mp3などと同様の非可逆圧縮方式です。

Gstreamerのプラグインが用意されているAACのエンコーダとデコーダで代表的なものはfaacとfaadです。Fedora12上でインストールする手順は以下のようになります。

ソースコードをダウンロード後、通常の手順で進みます。
faac-1.28
$ ./configure
$ make

ここでエラーが発生。

mpeg4ip.h:126: error: new declaration ‘char* strcasestr(const char*, const char*)’
/usr/include/string.h:367: error: ambiguates old declaration ‘const char* strcasestr(const char*, const char*)’

gccのバージョンにも関連することのようですが、標準関数の再定義のコンフリクトのようです。とりあえず該当部分をコメントアウトしてみました。

common/mp4v2/mpeg4ip.h
/*
#ifdef __cplusplus
extern “C” {
#endif
char *strcasestr(const char *haystack, const char *needle);
#ifdef __cplusplus
}
#endif
*/

再び

$ make

以下のwarningが出ますがコンパイルは通ります。

dereferencing type-punned pointer will break strict-aliasing rules

インストールします。

$ sudo make install

続いてデコーダ。こちらは問題なくインストールできます。

faad2-2.7
$ ./configure
$ make
$ sudo make install

faacとfaadはgst-plugins-goodに含まれますので、gst-plugins-goodを再インストールしてgstreamerプラグインを作ります。gst-inspectでfaacとfaadが現れるようになれば成功です。

少し試してみます。(以下、未整理)

MP4コンテナーに格納されておらず、ADTSヘッダも付いていない生のAACデータ(MPEG-2 AACやMPEG-4 AACデータ)のこと。拡張子には.aacを用いる。

gst-launch filesrc location=track-01.wav ! wavparse ! faac outputformat=0 ! filesink location=track-01-raw.aac

$ gst-launch -v filesrc location=track-01-raw.aac ! faad ! pulsesink
Setting pipeline to PAUSED …
Pipeline is PREROLLING …
ERROR: from element /GstPipeline:pipeline0/GstFaad:faad0: Could not decode stream.
Additional debug info:
gstfaad.c(1268): gst_faad_chain (): /GstPipeline:pipeline0/GstFaad:faad0:
failed to parse non-packetized stream
ERROR: pipeline doesn’t want to preroll.
Setting pipeline to NULL …
Freeing pipeline …

$ gst-launch -v filesrc location=track-01-raw.aac ! aacparse ! faad ! pulsesink
Setting pipeline to PAUSED …
Pipeline is PREROLLING …
/GstPipeline:pipeline0/GstAacParse:aacparse0.GstPad:src: caps = audio/mpeg, framed=(boolean)true, mpegversion=(int)4, channels=(int)2, stream-format=(string)adts
/GstPipeline:pipeline0/GstFaad:faad0.GstPad:sink: caps = audio/mpeg, framed=(boolean)true, mpegversion=(int)4, channels=(int)2, stream-format=(string)adts

$ gst-launch -v filesrc location=track-01.wav ! wavparse ! faac outputformat=0 ! aacparse ! faad ! pulsesink
Setting pipeline to PAUSED …
Pipeline is PREROLLING …
/GstPipeline:pipeline0/GstFaac:faac0.GstPad:src: caps = audio/mpeg, mpegversion=(int)4, channels=(int)2, rate=(int)44100, stream-format=(string)raw, codec_data=(buffer)1210
/GstPipeline:pipeline0/GstFaac:faac0.GstPad:sink: caps = audio/x-raw-int, endianness=(int)1234, channels=(int)2, width=(int)16, depth=(int)16, signed=(boolean)true, rate=(int)44100
/GstPipeline:pipeline0/GstAacParse:aacparse0.GstPad:src: caps = audio/mpeg, mpegversion=(int)4, channels=(int)2, rate=(int)44100, stream-format=(string)raw, codec_data=(buffer)1210, framed=(boolean)true
/GstPipeline:pipeline0/GstAacParse:aacparse0.GstPad:sink: caps = audio/mpeg, mpegversion=(int)4, channels=(int)2, rate=(int)44100, stream-format=(string)raw, codec_data=(buffer)1210
/GstPipeline:pipeline0/GstAacParse:aacparse0.GstPad:sink: caps = audio/mpeg, mpegversion=(int)4, channels=(int)2, rate=(int)44100, stream-format=(string)raw, codec_data=(buffer)1210
/GstPipeline:pipeline0/GstFaad:faad0.GstPad:sink: caps = audio/mpeg, mpegversion=(int)4, channels=(int)2, rate=(int)44100, stream-format=(string)raw, codec_data=(buffer)1210, framed=(boolean)true
/GstPipeline:pipeline0/GstFaad:faad0.GstPad:src: caps = audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)44100, channels=(int)2
/GstPipeline:pipeline0/GstPulseSink:pulsesink0.GstPad:sink: caps = audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)44100, channels=(int)2
Pipeline is PREROLLED …
Setting pipeline to PLAYING …
New clock: GstPulseSinkClock
/GstPipeline:pipeline0/GstPulseSink:pulsesink0: volume = 0.022385
/GstPipeline:pipeline0/GstPulseSink:pulsesink0: mute = FALSE

gst-launch filesrc location=track-01.wav ! wavparse ! faac outputformat=1 ! filesink location=track-01-adts.aac

$ gst-launch playbin uri=file:/home/eigo/media/KenEtc/track-01-adts.aac

$ gst-launch filesrc location=track-01.wav ! wavparse ! faac outputformat=0 ! qtmux ! filesink location=track-01-raw.mp4

$ gst-launch filesrc location=track-01.wav ! wavparse ! faac outputformat=1 ! qtmux ! filesink location=track-01-adts.mp4

$ gst-launch playbin uri=file:/home/eigo/media/KenEtc/track-01-raw.mp4

$ gst-launch filesrc location=track-01.wav ! wavparse ! faac outputformat=1 ! qtmux ! filesink location=track-01-adts.mp4
Setting pipeline to PAUSED …
Pipeline is PREROLLING …
ERROR: from element /GstPipeline:pipeline0/GstWavParse:wavparse0: Internal data flow error.
Additional debug info:
gstwavparse.c(2046): gst_wavparse_loop (): /GstPipeline:pipeline0/GstWavParse:wavparse0:
streaming task paused, reason not-negotiated (-4)
ERROR: pipeline doesn’t want to preroll.
Setting pipeline to NULL …
Freeing pipeline …

  1. No comments yet.
  1. No trackbacks yet.