yamamoto2002
yamamoto2002
オーディオ関連のフリーソフトウェアを作っています。 Amazon.co.jpのyamamoto2002さんは別人です。 楽天オークションのyamamoto2002さんも別人です。 Twitt…

マイルーム

yamamoto2002のページ
yamamoto2002のページ
yamamoto2002のページです。
所有製品

レビュー/コメント

カレンダー

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

最新のレス

お気に入り製品

お気に入り製品はありません

日記

FLACのLR2チャンネル音声の格納の仕組み

このエントリーをはてなブックマークに追加
2017年03月03日

FLACはPCM音声データをフレームと呼ばれる入れ物の中に格納する。ファイルには複数のフレームが連結されて入っている。個々のフレームの頭の部分(ヘッダ)にフレーム内に入っているPCMデータのサンプル数が記入される。1個のフレームに入る音声サンプル数は16サンプル以上65535サンプル以下。FLACは可逆圧縮なので圧縮率はPCMデータの乱雑さによって変動し、その結果各フレームに入っているサンプル数が同じでも個々のフレームのバイト数は異なる。フレームという概念は早送りでファイルをシークしようとしたとき必要になってくる。

で、LR2本ある音声ストリームを1本にシリアライズするとき、個々のストリームを圧縮し、各々サブブロックに格納し計2個のサブブロックを作る。この2つのサブブロックを包括する概念にブロックという名前が付いている。1個のブロックの中のサブブロックのサンプル数は同じ。で、このブロックをフレームに入れる。

FLACではLR2本の音声を圧縮器に投入する前に圧縮率が改善しやすい形に変換する方法が用意されている:

①M=L+R、S=L-Rの2つのストリームに変換してから圧縮する。
②Lと、S=L-Rの2つのストリームに変換してから圧縮する。
③Rと、S=L-Rの2つのストリームに変換してから圧縮する。
④LとRをそれぞれ圧縮する。

①はMSマイクみたいな方法で、Sの情報量が少なくなって可逆圧縮で小さくなりそうで一見良さそうだが、実は①よりも②のほうが圧縮率が高くなることが多いとのことであった。可逆圧縮なのでどの方法でもデータは元に戻るが、圧縮率が改善すればファイルサイズがより小さくなり、I/O負荷が改善し、コンピューターの諸々の資源の利用率が下がって効率が良くなるので良い。あるフレームは①、次のフレームは②といった具合に、フレームごとに①~④を選ぶことができる。

FLACエンコーダーのリファレンス実装libFLAC-1.3.2のstream_encoder.cの3200行目付近に以下のようなコードがあり、最もフレームサイズが小さくなる方法を選んでいるようであった。
  /* We have to figure out which channel assignent results in the smallest frame */
  bits[FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT] =
    encoder->private_->best_subframe_bits [0] +
    encoder->private_->best_subframe_bits [1];
  bits[FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE ] =
    encoder->private_->best_subframe_bits [0] +
    encoder->private_->best_subframe_bits_mid_side[1];
  bits[FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE ] =
    encoder->private_->best_subframe_bits [1] +
    encoder->private_->best_subframe_bits_mid_side[1];
  bits[FLAC__CHANNEL_ASSIGNMENT_MID_SIDE ] =
    encoder->private_->best_subframe_bits_mid_side[0] +
    encoder->private_->best_subframe_bits_mid_side[1];

  channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT;
  min_bits = bits[channel_assignment];
  for(ca = 1; ca <= 3; ca++) {
    if(bits[ca] < min_bits) {
      min_bits = bits[ca];
      channel_assignment = (FLAC__ChannelAssignment)ca;
    }
  }

以上の雑な説明を総括すると、FLACはLR2チャンネルのPCMサンプルデータを以下のいずれかの方法で格納する。ブロックごとに①~④のうち最もサイズが小さくなる方法を選ぶ。

①HMMM…MSSS…S
②HLLL…LSSS…S
③HRRR…RSSS…S
④HLLL…LRRR…R

H: ヘッダ
L: Lチャンネルサンプル値
R: Rチャンネルサンプル値
M: L+R (ミッドチャンネル)
S: L-R (サイドチャンネル)

実例を調べてみた。

Bach Collegium Japan バッハ モテット BWV227 Denn Das Gesetz Des Geistes (3声の女声合唱)
曲の長さ=56秒、1ブロック=4096サンプル。①~④すべてが使用されている。
①①①④④④④④①①①④①④①①①③①①①①①①②①④①①①①①②①
①①①①①①①①①③③②①①①④③①②①④①③①③③④④①③③①①①
①①①③③①①①①①③①①①③③③④①①①③①③①①①③①①①①①①
④①①③④①④①①①①①②①①①①①④①④④④①①①①①①①①①①①
①①①①④④④①①①④④①①①①①①①①①④①①④①①①①③①①③③
④①①④②①④①④①③①①①④①①③①④③①①④③③③③③④①①①③
③③①①③③③④③③③①①②④①②④③③③③④①①④④①③③④④④①
③③④④③③①①①④①①①④③③①①②②②②②②④①①④③③①①①①
④④①②④①②①③①①①④①①①③②②①①①①③①④④②①①①④③③
③③④④④①③③③①①①①③①①①①①①①①①④③①③③①③①①①③
①②②④①④④②④④④①①④②④①③④④④②③③①④①①①③④④①①
④④④③④①①①①③③①①①④④④④④④①①①①③④④①①④④④④①
③①④①③①③①①①②②②②①①①③①①③③①①③①①①③①③③③③
④③③③③③④③③③③③③④①④④④③①④①①①①①②②②②②②①②
②②①①④③①③③①③③①①②④③①③①①①③③③③④④③①①③③①
①①②④①④④④④①④②①①①①①①①①①①①①①①①①①④①①④④
①①①①①①①①①①①①①①①①①①①①①①①①①①①①①①①①④④
③①④①④④④④①①①④④①①①①①①①①①①①④①④

アルゲリッチ ラヴェル 高雅で感傷的なワルツ 6. Vif (ピアノ独奏曲) 0028947758709
曲の長さ=41秒、1ブロック=4096サンプル。①と④のみで構成されている。
④④①①①①①①①①①①①①①①①①①①①①①①①①①①①①①①④④
④①④①①①④④④①④①①①①①①①①④①①①④①④④①①①①①①①
①①①①①①①①①①①①④①①④④④①①①④④①④④①①①①①①①①
①①①①①①①①①①①④④①④④④④①④①①①④①④④④①④①④④①
①④④①①①④④④①④①①①①①①①④④④④①①①①①④①①①①①④
①④①④①①④④④①①④④④①①①①①①①①①①①①①①④④①①①①
①①④①①①①④④①④④④①①④①④①④④①①①①④①④①④①④①④
①①④①④④①④①①①①①①①①①①①①①①①④④①④④①④①①①①
①①①①①①④④①①①④④④④④④④④①①①①①①①①①①①①①①①
①①①①①①①①①①①①④①①①①①①①①①①①①①①①①①①①①①
①④①①①①①①①④④①①④④①①①①①①①①①①①④④①④④④④④
④④④④①①①④①①①①①①①①①①①①④①①①①④④①①①①①①①
①①①①①①①①①①①①①①①①①①④④④④④④④④④④④④④④④④
④④④

参考文献
https://xiph.org/flac/format.html

次回の日記→

←前回の日記

レス一覧

  1. こんばんは。
    一つお聞きしたいのです。FLACはフリーソフトだと思うのですが、これを使用するために必要な関数などは、Lynuxのようにどこかの誰かが無償で提供してくれるので、だれでも自由に使えるという事なのでしょうか。

    これだけのソフトウエアを作るためにはかなりの知識と時間が必要で、仮にハードウエアで実装するとなると、そのライブラリーはメーカーが提供して必ず有償でしょう。

    ソフトウエアはパソコンがあればよいので設備投資はかかりませんが、無償提供は随分な大盤振る舞いです。ハードとの文化の違いかもしれませんが、随分と違うなあと感じます。

    by如月 at2017-03-04 20:38

  2. こんばんは。

    自分の作ったプログラムのソースコードを無料で配布する理由は人それぞれで色々あると思いますが、昔から欲しい人全員にあげることが簡単にできていたので元々無料との親和性が高いのだと思います。今はインターネットがあるのでさらに配布が容易です。ハードウェアは自分の作ったものを他の人にあげたら自分の持っているものが1つ減りますので性質がかなり異なりますね!

    byyamamoto2002 at2017-03-04 23:44

レスを書く

レスを書くにはログインする必要があります
ログインする