Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C#

C# MP3 Compressor

0.00/5 (No votes)
15 Oct 2012CPOL2 min read 21.9K   1.8K  
This is a bug fix to C# MP3 Compressor.

Introduction

Please note - this tip is merely an update to the code published in the article C# MP3 Compressor. I did not write any of this original code, but I've found it very useful so I created this tip to fix a couple of bugs and provide a little more background on the RIFF format. 

The original project is a very useful example of MP3 compression and WAV to MP3 conversion, but I was experiencing problems with WAV files that contain additional chunks (e.g., BWAV format, stuff from ProTools, etc.). The WaveStream class made some unsafe assumptions about the structure of the RIFF data, so here is my fix for the problems I encountered.

As with the original, there is code from the article: A low level audio player in C# by Ianier Munoz. In fact, this is the only code I've changed.

The project has also been upgraded to VS2010.

Background

Here are a couple of useful articles about the RIFF file format:

Using the Code

The only changes are in the WaveStream.cs file, in the yeti.mmedia project.

There are two main bug fixes:

  1. It is no longer assumed that the "fmt" chunk will be the first data chunk after the RIFF header. It might well not be.
  2. The old code assumed that all the chunk headers would be DWORD (4 byte) aligned. This is not at all guaranteed, the RIFF format only mandates word (2 byte) alignment. In some cases, this would cause the chunks to be missed, and the file would fail to read.

The code now also accounts for cases where a chunk's data is an odd number of bytes long, in which case there should be a padding byte which is not counted in the chunk length field. Apparently. I've never seen this in a real life file, but if it occurs the code should handle it.

Additional Resources

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)