web-dev-qa-db-ja.com

.wavファイルのバイトは何を表していますか?

.wavファイルのデータをバイト配列に格納するとき、これらの値はどういう意味ですか?私はそれらが2バイト表現であると読んだことがありますが、これらの2バイト値には正確に何が含まれていますか?

32
user1330691

オーディオ信号はある種の波で表されることを聞いたことがあるでしょう。この波線図を見ながら線が上下するのを見たことがあれば、それが基本的にこれらのファイルの中にあります。 http://en.wikipedia.org/wiki/Sampling_rate からこのファイル画像を見てください

sampling

オーディオ波が表示されます(灰色の線)。その波の現在の値は繰り返し測定され、数値として与えられます。それがそれらのバイトの数字です。これで調整できる2つの異なるものがあります:1秒あたりの測定回数(Hz単位のサンプリングレート-1秒あたりの取得数)。もう1つの調整は、測定の正確さです。 2バイトの場合、1回の測定に2バイトを使用します(通常は-32768〜32767の値です)。したがって、そこに指定されたこれらの数値を使用して、元のウェーブを再作成できます(もちろん、品質は限られていますが、デジタルで保存する場合は常にそうです)。元のウェーブを再現することは、スピーカーが再生時に実行しようとしていることです。

知っておく必要のあることがいくつかあります。まず、2バイトなので、数字を正しく再作成するにはバイトオーダー(ビッグエンディアン、リトルエンディアン)を知る必要があります。第二に、あなたが持っているチャンネルの数と、それらがどのように保存されているかを知る必要があります。通常、モノラル(1チャンネル)またはステレオ(2)がありますが、それ以上の可能性もあります。複数のチャネルがある場合、それらがどのように保存されているかを知る必要があります。多くの場合、それらをインターリーブします。つまり、すべての時点で各チャネルに対して1つの値を取得し、その後、次の時点ですべての値を取得します。

例:2つのチャネルと16ビット数の8バイトのデータがある場合:

abcdefgh

ここで、abは、チャネル1の最初の値である最初の16ビット数を構成します。cdは、チャネル2の最初の数です。 。efはチャンネル1の2番目の値、ghはチャンネル2の2番目の値です。それは1秒のデータに近づかないでしょう...

持っているすべての情報をまとめると、ビットレートを計算できます。これは、1秒間にレコーダーによって生成される情報のビット数です。この例では、サンプルごとにチャネルごとに2バイトを生成します。 2つのチャネルでは、4バイトになります。人間のビーイングが通常聞くことができる音を表すには、毎秒約44000サンプルが必要です。したがって、最終的には1秒あたり176000バイト、つまり1秒あたり1408000ビットになります。

そしてもちろん、それは2ビット値ではなく、そこにある2つの2バイト値です。そうしないと、品質が本当に悪くなります。

53
kratenko

最初の44バイトは、ここで説明されているように、通常は標準のRIFFヘッダーです。 http://tiny.systems/software/soundProgrammer/WavFormatDocs.pdf およびここ: http:// www。 topherlee.com/software/pcm-tut-wavformat.html

Apple/OSX/macOS/iOSで作成された.wavファイルは、ヘッダーに「FLLR」パディングチャンクを追加し、初期ヘッダーRIFFのサイズを44バイトから4kバイトに増やす可能性がありますサンプルデータ)。

残りは多くの場合、符号付き2の補数のリトルエンディアン形式の16ビット線形PCMであり、44100 Hzのレートで任意にスケーリングされたサンプルを表します。

Wave File Format

16
hotpaw2

WAVE(.wav)ファイルには、オーディオファイルのデータのフォーマット情報を示すヘッダーが含まれています。ヘッダーに続くのは、実際のオーディオ生データです。以下で正確な意味を確認できます。

Positions  Typical Value Description

1 - 4      "RIFF"        Marks the file as a RIFF multimedia file.
                         Characters are each 1 byte long.

5 - 8      (integer)     The overall file size in bytes (32-bit integer)
                         minus 8 bytes. Typically, you'd fill this in after
                         file creation is complete.

9 - 12     "WAVE"        RIFF file format header. For our purposes, it
                         always equals "WAVE".

13-16      "fmt "        Format sub-chunk marker. Includes trailing null.

17-20      16            Length of the rest of the format sub-chunk below.

21-22      1             Audio format code, a 2 byte (16 bit) integer. 
                         1 = PCM (Pulse code modulation).

23-24      2             Number of channels as a 2 byte (16 bit) integer.
                         1 = mono, 2 = stereo, etc.

25-28      44100         Sample rate as a 4 byte (32 bit) integer. Common
                         values are 44100 (CD), 48000 (DAT). Sample rate =
                         number of samples per second, or Hertz.

29-32      176400        (SampleRate * BitsPerSample * Channels) / 8
                         This is the Byte rate.

33-34      4             (BitsPerSample * Channels) / 8
                         1 = 8 bit mono, 2 = 8 bit stereo or 16 bit mono, 4
                         = 16 bit stereo.

35-36      16            Bits per sample. 

37-40      "data"        Data sub-chunk header. Marks the beginning of the
                         raw data section.

41-44      (integer)     The number of bytes of the data section below this
                         point. Also equal to (#ofSamples * #ofChannels *
                         BitsPerSample) / 8

45+                      The raw audio data.            

これらすべてを http://www.topherlee.com/software/pcm-tut-wavformat.html ここからコピーしました

6
seanxiaoxiao

他の人が指摘したように、wavファイルにはメタデータがありますが、具体的には、(メタデータではなくデータの)バイトは何を意味するのでしょうか?その場合、バイトは記録された信号のを表します。

どういう意味ですか?さて、各サンプルを表す2バイト(たとえば)を抽出すると(モノラル録音、つまりサウンドの1つのチャンネルのみが録音されたと想定)、16ビット値が得られます。 WAVでは、16ビットは(常に?)署名され、リトルエンディアンです(ちなみに、WAVに対するMac OSの回答であるAIFFはビッグエンディアンです)。したがって、その16ビットサンプルの値を取得し、それを2 ^ 16(または符号付きデータの場合は2 ^ 15)で割ると、範囲内に正規化されたサンプルになります-1〜1。すべてのサンプルに対してこれを行い、それらを時間に対してプロットします(時間は記録のサンプル数/秒によって決まります。たとえば、44.1KHzは44.1サンプル/ミリ秒を意味するため、最初のサンプル値はtでプロットされます。 = 0、t = 1msで44番目など)、元々記録されたものを大まかに表す信号が得られます。

5
Pat

2ビットのオーディオはあまり良い音にはなりません:)最も一般的には、44.1kHzなどの周波数でサンプリングされたオーディオ波形を表す16ビットの符号付き数値としてサンプル値を表します。

3
TJD

あなたの質問は、「。wavファイルのデータブロックのバイトは何を表しているのでしょうか?」すべてを体系的にお知らせください。
Prelude:何らかのデバイスを使用して5KHzの正弦波を再生し、「sine.wav」というファイルに記録するとしましょう。録音は単一のチャンネル(モノ)で行われます。これで、そのファイルのヘッダーが何を表しているかがすでにわかりました。重要な定義をいくつか見ていきましょう。

  • サンプル:任意の信号のサンプルとは、サンプルが取得されるポイントでのその信号の振幅を意味します。 The sample at t=1.23 is taken where the amplitude is 0.94. Thus the sample value is 0.94
  • サンプリングレート:このようなサンプルの多くは、一定の時間内に取得できます。 1秒以内に正弦波のサンプルを10個取得するとします。各サンプルの間隔は0.1秒です。したがって、1秒あたり10個のサンプルがあるため、サンプリングレートは10Hzです。ヘッダーの25番目から28番目のバイトは、サンプリングレートを示します。


今、あなたの質問の答えに来ています:
正弦波には無限のポイントがあるため、実際には正弦波全体をファイルに書き込むことはできません。代わりに、サンプリングレートを固定し、それらの間隔で波のサンプリングを開始し、振幅を記録します。 (サンプリングレートは、取得するサンプルを使用して、信号を最小限の歪みで再構築できるように選択されます。サンプル数が不十分なために再構築された信号の歪みは、「エイリアシング」と呼ばれます。)
エイリアシングを回避するために、サンプリングレートは正弦波の周波数の2倍(5kHz)以上に選択されます(これは 'sampling theorem' と呼ばれ、周波数の2倍のレートは「ナイキスト率」と呼ばれます)。したがって、12kHzのサンプリングレートで行くことにします。つまり、正弦波を1秒間に12000回サンプリングします。
記録を開始したら、5kHzの周波数の正弦波である信号を記録すると、12000 * 5サンプル(値)になります。これらの60000の値を取得して配列に入れます。次に、メタデータを反映する適切なヘッダーを作成し、10進数で記載したこれらのサンプルを16進数に変換します。これらの値は、.wavファイルのデータバイトに書き込まれます。

プロットプロット: http://fooplot.com

1
Sushrut Kasture