mpg123 - MP3 プレーヤ

Linux で MP3 プレーヤ,というとやはり mpg123 です. KDE の KMP3 や xmms などの X ベースの MP3 プレーヤも mpg123 がベースになっています.



CPU が非力なマシンで実行する

私も最近新しいマシンを入手したのですが,ついこの前までは,PentiumODP 83 MHz のデスクトップと,i486DX4-75MHz でがんばっていました. このときに獲得したノウハウです.

i486 マシンの場合

コンパイル時に i486 用オプティマイズをかけることができます.

  1. mpg123 の tar.gz ファイルを展開します.
  2. make linux-i486 で,実行プログラムを作成します.

バッファリング

-b オプションでバッファサイズを指定することができます. バッファを大きくすると,再生がとぎれにくくなります. 単位は KB です.

私の経験では 8192 ぐらいを指定するとよいようです.

サンプルレート変換

mpg123 では,デフォルトでは使用している音源の最高のサンプルレートで再生しようとします. が,-2 で,音源の 1/2 (通常 22.05 kHz) のサンプルレートで再生するようになります.

-4 で 1/4 になりますが,こちらは音楽を鑑賞するにはいまひとつ,です.

ドライブ

デスクトップマシンの場合,バスマスタ DMA の有効なドライブに MP3 を置くと音切れが少なくなります.

前述の歴史的(?)デスクトップマシンでは,内蔵 IDE ドライブ (PIO) よりも SCSI (バスマスタ)のほうが音切れが少なくなりました.

SBPro 互換モードで音楽を楽しむ

私が今使っているノート PC は VAIO PCG-C1XE です. このマシンは音源にヤマハの PCI チップを積んでいて,linux では,最近まではフリーのドライバでネイティブモード動作させることができませんでした. この時使っていたワザです.

まずはパッチ

というわけで,パッチをこしらえました. mpg123-0.59r.tar.gz に対するパッチです.

このパッチを適用することにより,-D オプションが使えるようになります. ただし,再生サンプリングビット数が 8 bit でないと,このオプションは有効になりません.

SBPro 互換モードで困るのは

困るのはやはり,再生サンプリングビット数が 8 である,ということです. スピーカ再生には十分かな,と思いますが,へッドフォンで聴くと (再生時に生じる) 量子化雑音が気になります.

そのほか,再生サンプリング周波数が 2ch 再生で 22.05 kHz になる,というのもありますが,こちらはまぁ「高音がでないな」という程度で音楽を楽しむ分には気にはならないと思います(それに,これはソフトウェアではどうしようもない).

量子化雑音低減のワザ

私の(乏しい知識で)知っている限り,量子化雑音に有効なワザとしては

  1. ノイズシェーピング
  2. ディザ
の 2 つがあります.

ノイズシェーピングというのは,時間軸で見ると「そのサンプルで表現しきれなかった誤差を次のサンプルに持ち越す」というものです. 周波数軸でみると,量子化雑音に対してハイパスフィルタになっています. このテクニックは,最近の 1 ビット DAC の CD/MD プレーヤに採用されている(はず)です. (最近は 1 ビット DAC も普通になっているので,わざわざ「1ビット」ということはないようですね)

ディザのほうは,「量子化雑音と同量のホワイトノイズを加算してやる」というものです. 量子化雑音はそのままでは信号(音楽)と相関性があります. が,ホワイトノイズを加算してやると,その相関性を低くすることができます. ディザは,画像処理のほうでは一般的に使われています. 昔の TEAC の CD プレーヤにも使われていましたが,今はどうなっているのかな (^^;;

で,プログラムの方ですが,ノイズシェーピングほうも試してみたのですが,フィルタが不安定になるようで,楽曲によってはフィルタが発振してしまいました.

というわけで,このパッチではディザを採用しています.

Ctrl + C でプログラムが終了するようにする

Linux での mpg123 では,複数ファイルを指定した場合,Ctrl + C を入力すると次の曲に進んでしまいます. 「この動作が気にいらん」という場合は,以下の変更を行い,コンパイルし直すことにより,Ctrl + C でプログラムが終了するようになります.

  1. mpg123 の tar.gz ファイルを展開します.
  2. Makefile の次の行を追加します.
    linux:
            $(MAKE) CC=gcc LDFLAGS= \
                    OBJECTS='decode_i386.o dct64_i386.o decode_i586.o \
                            audio_oss.o term.o' \
                    CFLAGS='-DI386_ASSEM -DPENTIUM_OPT -DREAL_IS_FLOAT -DLINUX \
                            -DREAD_MMAP -DOSS -DTERM_CONTROL\
                            -DDONT_CATCH_SIGNALS \
                            -Wall -O2 -m486 \
                            -fomit-frame-pointer -funroll-all-loops \
                            -finline-functions -ffast-math' \
                    mpg123-make
    
    

ただし,このオプションでコンパイルすると,-b オプション(バッファ指定)が使えなくなってしまいます. これを有効にするには,プログラムの中をいじる必要があるので,このへんにしておきませう.

シャッフルプレーヤ

BGM で音楽を再生している場合,いちいち曲を指定するのが面倒になります (^^;; X ベースのプレーヤには大概「シャッフルプレイ」機能が付いているのですが,これは 1 曲単位で順番を入れ替えるので,色々な曲を入れると落ち着きません.

というわけで,「アルバム単位でシャッフルする」プレーヤを作ってみました. ここは安易に perl スクリプトで作ってみました.

あと,ssh 経由でリモートマシンの mp3 ファイルを再生するスクリプトも作ってみました.

必要なもの

プレーヤ実行に必要なものは

  1. sh
  2. perl
  3. mpg123
  4. ssh (sjukeboxのみ)
です.

ダウンロード

jukebox: ローカルファイル版

sjukebox: リモートファイル版

perl スクリプトなので,ダウンロード後,chmod +x jukebox とし,実行パスの通っているディレクトリに mv しましょう.

sjukebox のほうは,パーミッションの設定に加え,あらかじめリモートマシンに対しホスト認証(パスワード無しでのファイル実行)ができるようにしておきましょう. この設定無しでも実行できないことはないですが,1曲ごとにパスワードの入力を求められることになってしまいます.

MP3 ファイルの配置

アルバムごとに 1 つのディレクトリにまとめてあることが必要です.

例えば,私のマシンの場合

    mp3 -+
         +- COLOUR_BY_NUMBERS -+
         |                     |
         |                     +- track01.cdda.wav.mp3
         |                     +- track02.cdda.wav.mp3
         |                     .
         |                     .
         .
         .
         +- yusa_mimori -+- acacia -+
                         |          |
                         |          +- track01.cdda.wav.mp3
                         |          +- track02.cdda.wav.mp3
                         |             .
                         |             .
                         .
                         .
                         +- hitomi_suisho -+
                                           |
                                           +- track01.cdda.wav.mp3
                                           +- track02.cdda.wav.mp3
                                              .
                                              .
こんな感じでファイルを配置しています.

ファイル検索手順

このプログラムでのファイル検索アルゴリズムは

1. コマンドライン,もしくはプログラム埋め込みになっているディレクトリの下で
コマンドラインでディレクトリが指定されなかった場合に,プログラム埋め込みのディレクトリが有効になります.
2. リンクカウントが 2 となっているディレクトリをリストアップする
つまり,そのディレクトリの下にさらにディレクトリが掘られていない場合です.
3. 2. のディレクトリ以下の *.mp3 というファイルを再生する
というものです.


Linux のお部屋のもくじ
いまいくんのページのもくじ
2002 年 8 月 21 日更新
imai@jr0bak.homelinux.net