試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

x86_64なGNU/LinuxにおけるTTA(The True Audio)対応の現状

エンコード速度と圧縮率のバランスがよく、Matroska コンテナフォーマットでも使用できる、オーディオ可逆圧縮方式TTA(The True Audio)の対応状況について、情報に偏りや誤りがあるかもしれないが、実験の結果も交えてまとめてみる。

サンプルファイルの入手

http://www.matroska.org/tta/
から、sample_44_2_16.ttasample_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ことが判明。
MPlayerVLCAudacious(いずれも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)ttaenc3.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ファイルへエンコードする実験

元のTTAファイルのMD5ハッシュを確認しておくと

$ md5sum *.tta
e045db4070889c1136b1982ef24ebba3  sample_44_2_16.tta

となっている。このファイルを一度消して、32bit版ttaencTTAエンコードして、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などを含めた)サポート状況で(多少は)有利だと思う。あとは好みの世界かも。

追記:

  • [2007/6/22]ttaencとGStreamerプラグインについて、x86_64版特有の不具合に対処できたため、これに関連した記述を修正

使用したバージョン:

  • 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関連

*1:x86 Ubuntu(仮想マシン)での正常な再生と、x86_64 Gentoo(実環境)、x86_64 Ubuntu(仮想マシン)でのノイズ発生を確認

*2:「@@」の次の行から始まるテキスト領域

*3:Gentoo Linuxttaenc-3.3.ebuildでも「KEYWORDS="~x86"」となっていて、x86_64では入れようとしてもmissing keywordとなっていた。(以下2007/12/10追記)バージョン3.4.1からは「~amd64」に入った

*4:音量をあらかじめスキャンしておいて、タグ情報に音量(補正)情報を記録し、プレーヤーがこれを読み取り処理することで、実際に出てくる音量を一定のレベルにする仕組み