2016年11月1日火曜日

MP3ってどうなってるの? (1)

むっ、すでに11月、どうりで寒いわけだわ.

先ほどは、奥さんにしてやられました.

近所を自転車で走り回る必要があり、午前中雨だったため使われていなかった奥さん用の電動自転車で走り始めました.しかし直後に2つの問題が発覚.

まず、バッテリー残量が1/4しかありません.これじゃぁ坂道の往復で空になってしまふ.

そしてさらに、タイヤのリムが路面に当ってゴリゴリという嫌な感触がお尻に伝わってきます.エア抜けでタイヤがほぼ潰れていました.

う~ん、、、fuckとしか言いようが無い状況.ガミラスの偵察機を迎撃するためにコスモゼロで飛び出したが弾薬無し+エンジン不調で墜落してしまったような悔しさを感ずる.

自分が使うものなんだから、自分で充電しとけよ、空気入れとけよ.  >  奥さん殿

自転車走行不能とみて、押して引き返して充電+空気を入れました.正直者は馬鹿を見るという諺を思い出しました.

-----
回路系の話題です.

先日まで、HDMIの信号発生回路の自作を連載していました.今回からはMP3を調査中です.なぜにHDMIとMP3なのか?それは追々明かしてゆきます.

waveフォーマット
いきなりMP3に行かずに、.wav形式のファイルを最初に調べました.wavは非圧縮です.

ファイルの先頭に、たしか44バイトのヘッダがついていて、チャンネル数やサンプリング周波数やファイルサイズが記載されています.

ヘッダの後方はEOFまで16bitサンプルデータがLRLRLRLR....で続いています.たしかリトルエンディアンだったかな.非圧縮なのでファイルフォーマットはお手軽そのものですな.

わたしが使っているPCはOSがKona-Linux3.0です.
いくつかのオーディオ再生アプリがインストールされていますけど、ごく簡単にコマンドラインで使えるコマンドがあります.(wavのみに対応)
apt-get install aplay
aplay -t wav gravity.wav
ただしaplayはrootだと動きませんで、一般ユーザーでログインする必要があります.自分で生成したファイルの動作確認にはこんなんでもOKOK.

MP3フォーマットの第一印象
まだ全容を理解できていないのですが、やっぱ圧縮フォーマットはwaveに較べるとめんどくさいですね.

MP3データを伸張するには、まずハフマンテーブルという辞書を使った逆演算で可逆圧縮をほどきます.その後、再サンプリングして元のサンプルデータを得る.そんな2段階手続きを経るみたいです.

もうひとつ、MP3はフレームと云う長さ不定の単位でデータが区切られている.長さ不定とはいえ1152サンプル以下で1フレームになっているらしい.だが、音声末尾や通信途絶時には1152の限りにあらずという意味だと思っているところ.厄介だねぇ.

訂正: サンプルプログラムの挙動から推測されたこととして、
・1152サンプルは不変であるようだ
・フレーム毎にbpsがめまぐるしく変化しているMP3ファイルが手元にある.たぶん可変ビットレートエンコードされたMP3ファイルなのだろう.
・固定ビットレートエンコードされたMP3ファイルならばtop~endまでbpsはひとまず一定である.しかし圧縮結果の辻褄あわせだろうか、フレーム毎にpaddingの有無が在り、フレーム長に1BYTEの変動が見られる.

とあるサンプルコード
ネットを徘徊しましたが、MP3の詳細な解説サイトは見当たりません.MP3はライセンスの縛りがいろいろあるため、ネットにせよ書籍にせよ文献が手薄だとどこかのサイトに書かれていました.なのでmp3関連ライブラリのソースを読むぐらいしかないらしい...

Linux用のMP3ライブラリを探しましたら、libmadが良く出てくるので参考にさせてもらってます.このlibmadですが、DLサイトを見ると最終UP日が2004年なんです.動くのだろうか?と心配でしたが、少しのトラブルで使えました.

libmadのソースフォルダ中に、minimad.cというサンプルプログラムがあります.それをお手本にすることにしました.

フレーム同期処理
MP3データから、長さが決まっていないフレームの先頭を見つけるにはどうしたらよいんだろうねぇ?というのが本日の疑問点です.

minimadにおける、フレーム同期処理は大まかにこんなです.

1)MP3ファイルを一気読みしてメモリに展開する.

2)フレームヘッダは4BYTEであり、その先頭は11bitの’1’が連続している.ゆえに、メモリを先頭から1BYTEづつチェックし、0xFFEをサーチするのが最初の仕事.ただしオーディオデータが偶然0xFFEである可能性は否定できない. =同期ミスの可能性が残る

3)同期ミスをしないための多重チェック1
フレームヘッダの個々の情報には「予約」扱いの情報が4つばかりあるので、もしも「予約」が登場したら、それは同期ミスである.しかしこんなザルチェックでは確率的に同期ミスが生じる可能性は否定できなかろう.

4)同期ミスをしないための多重チェック2
CRCで確認する.CRCの有無を選択できる.CRCを使えば同期ミスは根絶できそうに思う.CRC仕様についてはよく理解できていない.

5)後続のフレーム探索も2~4に順じて慎重に行う.

MP3ライブラリ
Kona-Linux3.0 64bit版でlibmadを使うためのトラブルシュートを書いておきます.
libmadの説明(英文)はこちらにありました.

Linux用のMP3ライブラリのインストール.
apt-get update
apt-get install madplay
apt get install libmad-ocaml-dev

madplayは、mp3ファイルを再生するアプリです.使用例です.
$ madplay gravity.mp3
MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al.
Invalid MIT-MAGIC-COOKIE-1 keyxcb_connection_has_error() は真を返しました
          Title: Gravity
                 Copyright (C)  V
       Composer: 武田城以(CWF)
         Artist: ClariS
      Orchestra: ClariS
      Conductor:  V
          Album: Gravity
          Track: 1/4
          Genre: Soundtracks
madplayで/dev/pcmが無いというエラーが出るかもしれません.そういうときは、
$ modprobe snd-pcm-oss
これで/dev/pcmが作られます.お試し下さい.

libmad-ocaml-devは、libmadライブラリです.madplayを動かすのに必要です.(ソースではありません.windowsでいえばdllみたいなもの)

ライブラリソースを入手してビルドしたい場合は、
libmad-0.15.1b.tar.gz
を検索すれば見つかるでしょう.DLして解凍します.

フォルダの中にあるINSTALLというtextファイルがビルド手順を説明しています.
要するに、configure → make → make install の3手順でOKよ、というわけなのですが、トラブルがありました.

configure で id3tagが無いというエラーが出ました.id3tagとはMP3にメタデータを付加するための機能のようです.そんなのオレには関係ねぇです.

以下のようにしてライブラリを追加して解決しました.
$ apt-cache search libid3tag
libid3tag0 - MAD プロジェクトによる ID3 タグ読み込みライブラリ
libid3tag0-dev - MAD プロジェクトによる ID3 タグ読み込みライブラリ
$ apt-get install libid3tag0
$ apt-get install libid3tag0-dev

次にmakeしますと、2つ目のトラブルが生じます.gccのoptionにある-fforce-memは古い機能なのでそんなの知らんとgccが怒ります.

以下のようにして解決しました.
configureの中にある、optimize="$optimize -fforce-mem" を行削除.
configure.acの中にある、optimize="$optimize -fforce-mem" を行削除.

以上にて、わたしの環境(Kona-Linux3.0 64bit)では動いています.



なお、上の情報の間違いのせいで貴方が損害を受けてもいつものようにわたしは関知しません.

その2へ

かしこ


人気ブログランキングへ

6 件のコメント:

  1. 女性のメカ物やエレキ物に対する扱いの荒さや愛の無さはなんなのでしょうかね?
    見ているとハラハラして胃が痛くなりそう。
    自分が服やカバンを雑に扱うと奥さんに怒られるのと似ているのだろうか。そういえば服とか形が不定形で柔らかい物に愛情湧かない。なぜだろう。

    返信削除
    返信
    1. ex. スマホを落としてガラスを割るw

      削除
  2. MP3って可逆圧縮なんですねー。
    圧縮率変えられるのは、サンプリングレートを変えてるだけなんですかね。
    意外でした~。

    返信削除
    返信
    1. 1段目の「音消し」は不可逆圧縮で、2段目は可逆ということになっています.
      MPEGの音声は1段目のみの規格もあるようです.MP3はより圧縮率を高めるために2段目もやるらしい.

      削除
    2. 大して耳は良くないのですが、ハイレゾの音楽(といっても宇多田ひかるとか)を聞いているとなんかいい音に聞こえるのは不思議。
      擬薬効果かも。

      削除
    3. サンプリング周波数の高いタイプのハイレゾ、あるいはDSDはとても良いと思います.ボーカルの吐息のリアリティは23%増しと推定します.
      比較する機会があれば、ハイハットの音が、44kfsだと偽物に聞こえるのに対し、DSDだと本物の音に聞こえるかもしれません.

      ちな、宇多田さんの最新アルバムは母親の声に似てきたと、某バーのマスターが指摘しております.自殺するなよ.

      削除