x86_64なGNU/LinuxにおけるTTA(The True Audio)対応の現状
エンコード速度と圧縮率のバランスがよく、Matroska コンテナフォーマットでも使用できる、オーディオ可逆圧縮方式TTA(The True Audio)の対応状況について、情報に偏りや誤りがあるかもしれないが、実験の結果も交えてまとめてみる。
サンプルファイルの入手
http://www.matroska.org/tta/
から、sample_44_2_16.ttaとsample_44_2_16_TTA.mkaをダウンロードする。
コンテナ形式「(TTA).tta」の再生
TTA公式のGStreamerプラグインがあるが、バージョン0.10の時点ではメンテされていないため、gst-plugins-badに含まれている。これを使用して実験したところ
$ gst-launch-0.10 filesrc location=sample_44_2_16.tta ! ttaparse ! ttadec ! alsasink
x86な環境ではきちんと再生されることを確認したが、x86_64環境でのみ、「ザー」というノイズになってしまう*1ことが判明。
MPlayer、VLC、Audacious(いずれもx86_64版)での再生は問題なかった。
なお、この問題は、gst-plugins-badのTTAプラグインのソースに修正をしてビルドすることで解決する。
コンテナ形式「(TTA).mka」の再生
GStreamerでは、TTAのデコード部分(ttadec)に問題があるため、同様にx86_64環境でのみノイズとなったが、(TTA).tta同様、gst-plugins-badパッケージの中の、TTAプラグインのソースに修正をしてビルドすることで解決する。
$ gst-launch-0.10 filesrc location=sample_44_2_16_TTA.mka ! matroskademux ! ttadec ! alsasink
MPlayerでは、2007/6/19に取得したSubversion版でも未対応。
sample_44_2_16_TTA.mka を再生中 Cache fill: 0.00% (0 bytes) [mkv] Unknown/unsupported audio codec ID 'A_TTA1' for track 1 or missing/faulty [mkv] private codec data. [mkv] Track ID 1: audio (A_TTA1), -aid 0, -alang eng [mkv] No video track found/wanted. Matroska ファイルフォーマットと判断. ストリームを見付けることが出来ませんでした.
しかし、パッチがあり、これを適用してビルドしたところ、再生できるようになった。
sample_44_2_16_TTA.mka を再生中 [mkv] Track ID 1: audio (A_TTA1), -aid 0, -alang eng [mkv] No video track found/wanted. Matroska ファイルフォーマットと判断. ========================================================================== 音声コーデックを開いています: [ffmpeg] FFmpeg/libavcodec audio decoders AUDIO: 44100 Hz, 2 ch, s16le, 1411.2 kbit/100.00% (ratio: 176400->176400) Selected audio codec: [fftta] afm: ffmpeg (FFmpeg True Audio (TTA) decoder) ==========================================================================
なお、2007/3/21版ではパッチがそのまま適用できたが、2007/6/19に取得したSubversion版に対してパッチ当てを実験した結果、
patching file libmpdemux/demux_mkv.c Hunk #1 FAILED at 2052. Hunk #2 succeeded at 2211 (offset -84 lines). 1 out of 2 hunks FAILED -- saving rejects to file libmpdemux/demux_mkv.c.rej patching file libmpdemux/matroska.h
1つだけパッチ適用に失敗するHunk*2が出た。が、追加する部分の1つ下の行に些細な変更がされていただけだったので、もとのパッチと同様に修正できた。以下の部分以外は問題なし。
--- mplayer.orig/libmpdemux/demux_mkv.c +++ mplayer/libmpdemux/demux_mkv.c @@ -1978,6 +1978,10 @@ } track->a_formattag = mmioFOURCC ('f', 'L', 'a', 'C'); } + else if (!strcmp(track->codec_id, MKV_A_TTA)) + { + track->a_formattag = mmioFOURCC('T', 'T', 'A', '1'); + } else if (track->private_size >= RAPROPERTIES4_SIZE) { if (!strcmp(track->codec_id, MKV_A_REAL28))
AudaciousはまだMatroskaコンテナフォーマットに対応していないため、再生不可。今後に期待。
VLCでは、再生できそうでうまく動いてくれていない。やはり今後に期待。
TTAファイルを無圧縮PCMのWAVファイルへデコードする実験
TTA形式のエンコード/デコードを行うためのttaencは、GPLライセンスでsourceforge.net上で公開されているため、x86_64環境上でビルドすることはできるのだが、結論としては、64bit版は使いものにならない。*3
(2007/9/22)ttaencの3.4系はx86_64に対応し、問題が起こらなくなった。
64bit版に関しては、ソースに対して修正を行うことで、下で紹介している32bit版と同様、正常に動作させることが可能。→「x86_64版ttaenc-3.3を動作するように修正する[2007/6/22]」
$ ./ttaenc-3.3/ttaenc -d sample_44_2_16.tta TTA1 lossless audio encoder/decoder, release 3.3 Copyright (c) 2005 Alexander Djourik. All rights reserved. For more information see http://tta.sourceforge.net ------------------------------------------------------------ File: [sample_44_2_16.tta] Error: not compatible file format ------------------------------------------------------------ Total: [0/1, 0.0/0.0 Mb], ratio: 0.000, time: 0'00 ------------------------------------------------------------
そこで、32bitの実行ファイルとしてビルドしてみる。
--- Makefile.orig +++ Makefile @@ -2,7 +2,7 @@ # $Id: Makefile,v 1.2 2003/11/25 00:00:00 root Exp $ # -CFLAGS = -Wall -O2 -funroll-loops -fomit-frame-pointer +CFLAGS = -Wall -O2 -funroll-loops -fomit-frame-pointer -m32 LIBS = -lm TTAENC = ttaenc INSDIR = /usr/local/bin
$ ./ttaenc-3.3/ttaenc -d sample_44_2_16.tta TTA1 lossless audio encoder/decoder, release 3.3 Copyright (c) 2005 Alexander Djourik. All rights reserved. For more information see http://tta.sourceforge.net ------------------------------------------------------------ File: [sample_44_2_16.tta] Decode: wrote 3454688 bytes, done, ratio: 1.60, time: 1 time: 1 ------------------------------------------------------------ Total: [1/1, 3.3/2.1 Mb], ratio: 1.598, time: 0'01 ------------------------------------------------------------
32bitバイナリでは、正常にデコード処理が完了し、(無圧縮PCMの)WAVファイルが生成された。
32bit版ttaencでデコードしてできたWAVファイルをTTAファイルへエンコードする実験
$ md5sum *.tta e045db4070889c1136b1982ef24ebba3 sample_44_2_16.tta
となっている。このファイルを一度消して、32bit版ttaencでTTAにエンコードして、MD5が一致するかをチェックしてみる。
$ rm *.tta -f $ ./ttaenc-3.3/ttaenc -e sample_44_2_16.wav TTA1 lossless audio encoder/decoder, release 3.3 Copyright (c) 2005 Alexander Djourik. All rights reserved. For more information see http://tta.sourceforge.net ------------------------------------------------------------ File: [sample_44_2_16.wav] Encode: wrote 2161961 bytes, done, ratio: 0.63, time: 0 time: 0 ------------------------------------------------------------ Total: [1/1, 2.1/3.3 Mb], ratio: 0.626, time: 0'00 ------------------------------------------------------------ $ md5sum *.tta e045db4070889c1136b1982ef24ebba3 sample_44_2_16.tta
無事、ダウンロードしたものと同一のTTAファイルとなった。
なお、64bit版ttaencでエンコードしようとすると
$ ./ttaenc-3.3/ttaenc -e sample_44_2_16.wav TTA1 lossless audio encoder/decoder, release 3.3 Copyright (c) 2005 Alexander Djourik. All rights reserved. For more information see http://tta.sourceforge.net ------------------------------------------------------------ File: [sample_44_2_16.wav] Error: not compatible file format ------------------------------------------------------------ Total: [0/1, 0.0/0.0 Mb], ratio: 0.000, time: 0'00 ------------------------------------------------------------
となり、やはり使えない。エンコード/デコードともに問題なく使えるようにできる。
まとめ
- TTAのエンコード/デコードには、
32bitの実行ファイルとしてビルドしたttaencを使用するソースを修正して64bitの実行ファイルとしてビルドしたttaencを使用する - (TTA).ttaの再生は、Audacious,MPlayer,VLCとGStreamer対応プレーヤーが使用可能で、GStreamerのプラグインは、ソース修正でノイズ問題に対処できる
- (TTA).mkaの再生は、パッチを当てたMPlayerを使用するか、GStreamer対応のプレーヤー(ソースを修正したGStreamerプラグインを用いる)で行う。
GNU/Linux上でTTAを使用するのは個人的におすすめできない。おすすめできない理由が少なくなったので、好みにより、選択するのも悪くはない。公式のツールやプラグインが一部x86_64なLinux上で正常に動かないのがつらい。特にGStreamerのプラグイン。64bit版はソース修正により正常に動作可能。
Wine上でfoobar2000を使用することで、再生環境は多少改善されるが、音切れが起こることもあるため、よい方法とは言えない。
はじめからFLACを使用していれば、エンコードと同時にReplayGain*4のスキャンもできるし、再生は比較的軽いし、デコードするのも短時間。何より、アプリケーション側の(ReplayGainなどを含めた)サポート状況で(多少は)有利だと思う。あとは好みの世界かも。
追記:
使用したバージョン:
- gstreamer 0.10.11 / gst-plugins-bad(libgsttta.soを含むパッケージ) 0.10.4 / gst-plugins-good(libgstmatroska.soを含むパッケージ) 0.10.4
- MPlayer(svn) 20070321, 20070619
- VLC 0.8.6b, 0.8.6c
- Audacious 1.3.2 / Audacious-plugins 1.3.5
- ttaenc 3.3(x86版, x86_64無修正版)
以下、Wine関連
- Wine 0.9.39
- foobar2000 0.9.4.3 / foo_input_tta 2.4.2 / foo_input_matroska 0.9.2.0
*1:x86 Ubuntu(仮想マシン)での正常な再生と、x86_64 Gentoo(実環境)、x86_64 Ubuntu(仮想マシン)でのノイズ発生を確認
*2:「@@」の次の行から始まるテキスト領域
*3:Gentoo Linuxのttaenc-3.3.ebuildでも「KEYWORDS="~x86"」となっていて、x86_64では入れようとしてもmissing keywordとなっていた。(以下2007/12/10追記)バージョン3.4.1からは「~amd64」に入った
*4:音量をあらかじめスキャンしておいて、タグ情報に音量(補正)情報を記録し、プレーヤーがこれを読み取り処理することで、実際に出てくる音量を一定のレベルにする仕組み