When I store the data in a .wav file into a byte array, what do these values mean? I've read that they are in two-byte representations, but what exactly is contained in these two-byte values?

  • 2
    Maybe not the most technical sources possible but quite thorough nevertheless, the Wikipedia article about WAV – fvu Oct 23 '12 at 21:57

You will have heard, that audio signals are represented by some kind of wave. If you have ever seen this wave diagrams with a line going up and down -- that's basically what's inside those files. Take a look at this file picture from http://en.wikipedia.org/wiki/Sampling_rate


You see your audio wave (the gray line). The current value of that wave is repeatedly measured and given as a number. That's the numbers in those bytes. There are two different things that can be adjusted with this: The number of measurements you take per second (that's the sampling rate, given in Hz -- that's how many per second you grab). The other adjustment is how exact you measure. In the 2-byte case, you take two bytes for one measurement (that's values from -32768 to 32767 normally). So with those numbers given there, you can recreate the original wave (up to a limited quality, of course, but that's always so when storing stuff digitally). And recreating the original wave is what your speaker is trying to do on playback.

There are some more things you need to know. First, since it's two bytes, you need to know the byte order (big endian, little endian) to recreate the numbers correctly. Second, you need to know how many channels you have, and how they are stored. Typically you would have mono (one channel) or stereo (two), but more is possible. If you have more than one channel, you need to know, how they are stored. Often you would have them interleaved, that means you get one value for each channel for every point in time, and after that all values for the next point in time.

To illustrate: If you have data of 8 bytes for two channels and 16-bit number:


Here a and b would make up the first 16bit number that's the first value for channel 1, c and d would be the first number for channel 2. e and f are the second value of channel 1, g and h the second value for channel 2. You wouldn't hear much there because that would not come close to a second of data...

If you take together all that information you have, you can calculate the bit rate you have, that's how many bits of information is generated by the recorder per second. In our example, you generate 2 bytes per channel on every sample. With two channels, that would be 4 bytes. You need about 44000 samples per second to represent the sounds a human beeing can normally hear. So you'll end up with 176000 bytes per second, which is 1408000 bits per second.

And of course, it is not 2-bit values, but two 2 byte values there, or you would have a really bad quality.

  • 5
    You did not eventually mention what is the vertical axis in that diagram, or the nature of the value that is saved – wmac Oct 25 '17 at 5:30
  • thanks for the answer, but I have a doubt: if i have 9745238 frames and i have and 2 channel audio then i will get the data as 1st and 2nd channel simultaneously not alternatively in your example abcdefgh then a will belong to the first value to channel 1 and b will belong to the first value of the channel 2 and so on. should't it be that way? – P.hunter Dec 18 '17 at 8:01
  • @PaulNicolashunter in the example each value consists of 2 bytes (=16 bits), so ab is only a single value which is stored as a signed int16. cd is the first value of channel 2. Your version would be correct for 8bit audio (my example is consistent with my reading of the German Wikipedia article on it at de.wikipedia.org/wiki/… ). – kratenko Dec 18 '17 at 8:48
  • oh, okay actually i had this doubt because when i was observing an audio file having 2 channels under two python modules wave and scipy, wav returned a byte string which i later converted into 16bit int but scipy returned me a 9745238 X 2 matrix of signed 16bit-int (where 1 column is channel 1 data and 2 column is the channel 2 data), and when i compared it to the wav output of nparray it was in the order i told you in my previous comment, so it was contradicting a bit by your answer. – P.hunter Dec 18 '17 at 9:07
  • However, is there any robust method find these values (with 1, 2 channel consecutively) per second or millisecond, because when i multiplied the frame rate with the duration of my audio file it must return me total number of frames/samples but No, it returned me 9702000 whereas there are 9745238 in total any guesses why this is happening – P.hunter Dec 18 '17 at 9:12

The first 44 bytes are commonly a standard RIFF header, as described here: http://tiny.systems/software/soundProgrammer/WavFormatDocs.pdf and here: http://www.topherlee.com/software/pcm-tut-wavformat.html

Apple/OSX/macOS/iOS created .wav files might add an 'FLLR' padding chunk to the header and thus increase the size of the initial header RIFF from 44 bytes to 4k bytes (perhaps for better disk or storage block alignment of the raw sample data).

The rest is very often 16-bit linear PCM in signed 2's-complement little-endian format, representing arbitrarily scaled samples at a rate of 44100 Hz.

Wave File Format

  • can you tell how to play wave byte stream, without any header? – Babu James Nov 2 '15 at 6:41
  • @hotpaw2: may you pls come and help me or comment this similar question of mine here? stackoverflow.com/questions/58730713/… Regarding 16-bit 44Khz, I need to explain and comment why the values in data area are different from the image curve. – Johny Bony Nov 7 '19 at 10:25

The WAVE (.wav) file contain a header, which indicates the formatting information of the audio file's data. Following the header is the actual audio raw data. You can check their exact meaning below.

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.            

I copied all of these from http://www.topherlee.com/software/pcm-tut-wavformat.html here

  • 3
    Please use your terms correctly. You're intermingling bytes and bits. There is no such thing as a 32 byte integer - it's 32 bit. – RutledgePaulV Jul 24 '13 at 17:11

As others have pointed out, there's metadata in the wav file, but I think your question may be, specifically, what do the bytes (of data, not metadata) mean? If that's true, the bytes represent the value of the signal that was recorded.

What does that mean? Well, if you extract the two bytes (say) that represent each sample (assume a mono recording, meaning only one channel of sound was recorded), then you've got a 16-bit value. In WAV, 16-bit is (always?) signed and little-endian (AIFF, Mac OS's answer to WAV, is big-endian, by the way). So if you take the value of that 16-bit sample and divide it by 2^16 (or 2^15, I guess, if it's signed data), you'll end up with a sample that is normalized to be within the range -1 to 1. Do this for all samples and plot them versus time (and time is determined by how many samples/second is in the recording; e.g. 44.1KHz means 44.1 samples/millisecond, so the first sample value will be plotted at t=0, the 44th at t=1ms, etc) and you've got a signal that roughly represents what was originally recorded.


I suppose your question is "What do the bytes in data block of .wav file represent?" Let us know everything systematically.
Prelude: Let us say we play a 5KHz sine wave using some device and record it in a file called 'sine.wav', and recording is done on a single channel (mono). Now you already know what the header in that file represents. Let us go through some important definitions:

  • Sample: A sample of any signal means the amplitude of that signal at the point where sample is taken.The sample at t=1.23 is taken where the amplitude is 0.94. Thus the sample value is 0.94
  • Sampling rate: Many such samples can be taken within a given interval of time. Suppose we take 10 samples of our sine wave within 1 second. Each sample is spaced by 0.1 second. So we have 10 samples per second, thus the sampling rate is 10Hz. Bytes 25th to 28th in the header denote sampling rate.

Now coming to the answer of your question:
It is not possible practically to write the whole sine wave to the file because there are infinite points on a sine wave. Instead, we fix a sampling rate and start sampling the wave at those intervals and record the amplitudes. (The sampling rate is chosen such that the signal can be reconstructed with minimal distortion, using the samples we are going to take. The distortion in the reconstructed signal because of the insufficient number of samples is called 'aliasing'.)
To avoid aliasing, the sampling rate is chosen to be more than twice the frequency of our sine wave (5kHz)(This is called 'sampling theorem' and the rate twice the frequency is called 'nyquist rate'). Thus we decide to go with sampling rate of 12kHz which means we will sample our sine wave, 12000 times in one second.
Once we start recording, if we record the signal, which is sine wave of 5kHz frequency, we will have 12000*5 samples(values). We take these 60000 values and put it in an array. Then we create the proper header to reflect our metadata and then we convert these samples, which we have noted in decimal, to their hexadecimal equivalents. These values are then written in the data bytes of our .wav files.

Plot plotted on : http://fooplot.com


Two bit audio wouldn't sound very good :) Most commonly, they represent sample values as 16-bit signed numbers that represent the audio waveform sampled at a frequency such as 44.1kHz.

Your Answer

