Click here to Skip to main content
Click here to Skip to main content

Windows Media Audio compressor

, 8 Apr 2004
Rate this:
Please Sign up or sign in to vote.
Managed C++ Windows Media Audio (WMA) compressor.

Sample Image - Audio Compress

Introduction

As I mentioned in my previous article (C Sharp MP3 Compressor), I offer now a Windows Media Audio (WMA) compressor. This time I used managed C++ instead of C# in order to avoid the translation of interfaces and structures of the Windows Media Format SDK (WMF SDK). Microsoft has provided very limited managed support for their Windows Media SDKs (e.g. for the Windows Media Services SDK), but not for the WMF SDK. I think that Microsoft will logically include managed support for their WMF SDK in future versions, that's why I decided to avoid doing any translation. What I did was to create managed C++ classes that use some unmanaged classes, and have those unmanaged classes interact directly with the various Windows Media Format objects and interfaces.

In this work, there is code from the article A low level audio player in C# by Ianier Munoz.

Background

If you have never looked into the WMF SDK before, it is advisable that you take a look at the Windows Media Format SDK documentation for better understanding this article.

The following diagram represents the steps to create an Advanced Systems Format stream (ASF: the container format for Windows Media Audio and Windows Media Video-based content) using the WMF SDK:

Writing ASF Streams

Figure 1: Writing ASF Streams.

This diagram shows how to create ASF streams using a custom "Writer Sink". Custom writer sinks are needed for writing the resulting ASF stream to any kind of stream (in this case, any class derived from System.IO.Stream). As the diagram shows, the process is relatively simple. For more details about ASF creation, you can see Writing ASF Files and Using Custom Sinks in the Windows Media Format SDK documentation.

The compressor

The following figure is a simplified class diagram, which describes the managed version of the WMA compressor:

Windows Media Audio Compressor: Managed class diagram

Figure 2: Windows Media Audio Compressor: Managed class diagram.

The main class is WmaWriter, which interacts with the WMF SDK through unmanaged wrapper classes. It also acts as the sink object so the buffers received by its Write method are sent to the WMF writer object, which in turn sends back the compressed buffers through the sink interface. Finally, those buffers are written to the destination stream. WmaWriter receives the profile information through the class WmaWriterProfile, which represents the WMF IWMProfile.

WmaWriterProfileManger is a static class that contains some methods to handle profile creation and information. It also contains an array of WmaWriterProfile instances whose values represent the WMF System Profiles (audio only). This list of profiles should be enough for most purposes, but other profiles could also be created.

ManBuffer is a utility class for interfacing with the WMF SDK. It is just a managed implementation of buffer objects that implement INSSBuffer. Finally, ProfileManager is a utility class that creates and holds the WMF Profile Manager (IWMProfileManager).

If the WMF SDK was ported to managed code, this compressor could be implemented as shown in figure 2, with no more added complexity. Unfortunately, there is no such managed WMF SDK, therefore, some tricks and wrapper classes are necessary to implement the compressor. If you are interested in knowing the details, you can look at figure 3 in the implementation details section of this article.

Using the code

Using the WmaWriter is easy. You can use it in the same way you use BinaryWriter (WmaWriter is a specialization of BinaryWriter: see figure 2). The only difference with BinaryWriter is that you must indicate at creation time the format of the input data (data that the writer will receive) using a WaveFormat instance, and a profile defining the settings of the resulting compressed stream.

The following VB.NET code shows a simple way of compressing a WAV file using this compressor:

Imports Yeti.MMedia
Imports Yeti.MMedia.Wmf
Imports WaveLib
Imports System.IO
....

  Dim InStr As WaveStream
  Dim writer As AudioWriter
  Dim buff() As Byte
  Dim read As Integer

  InStr = New WaveStream("SomeFile.wav")
  Try
    writer = New WmaWriter(New FileStream("SomeFile.wma", FileMode.Create), _
                          InStr.Format)
    'The previous line is equivalent to:
    'writer = New WmaWriter(New FileStream("SomeFile.wma", FileMode.Create), _
    '                       InStr.Format, _
    '                       WmaWriterProfileManager.AudioSystemProfiles(0))
    Try
      buff = New Byte(writer.OptimalBufferSize - 1) {}
      read = InStr.Read(buff, 0, buff.Length)
      While (read > 0)
        writer.Write(buff, 0, read)
        read = InStr.Read(buff, 0, buff.Length)
      End While
    Finally
      writer.Close()
    End Try
  Finally
    InStr.Close()
  End Try

I made the sample project in VB.NET just to please those who love VB. Anyway, you can use the compressor in C#, Managed C++, J# or any other CLS compliant language. The sample project of the MP3 compressor (also included in the source files) is written in C#. You can also refer to my C Sharp MP3 Compressor article.

Another example of using the writer could be an improved version of the ripper described in my article "C Sharp Ripper" to rip directly to WMA format. In the file Form1.cs, inside the handler of the "Save as.." button, there is the line:

m_Writer = new WaveWriter(WaveFile, Format);

Which may be changed to:

m_Writer = new WmaWriter(WaveFile, Format);

The rest of the code remains without change and, of course, if you need more control on the compressor parameters, then you should add extra code to supply a WmaWriterProfile instance in the constructor.

Implementation details

The figure below is a more complete class diagram of the compressor, showing the managed classes and interfaces and their relations with the WMF SDK interfaces.

Figure 3: Windows Media Audio Compressor: implementation details.

I'm going to avoid the explanation of the implementation details. I just included the class diagram for those who want to see how this project was implemented and help them to better understand the code included with this article.

If you only want to use the compressor as is, then you can safely ignore these implementation details.

Conclusion

As showed here, the use of this compressor is relatively easy even if the implementation is somewhat complex due to interaction of managed and unmanaged code. There are some features of Windows Media Format that are not included in this project, such as DRM support, metadata attributes and two-pass encoding.

The sample code is given for demonstration purposes only, you can use it as reference if you need to develop some product with these technologies. When a managed version of WMF SDK is available, it will be easier to implement managed solutions using WMF. At the moment, this approach could be a good solution, considering that the unmanaged part can be suppressed without changing the design of managed part.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Idael Cardoso
Web Developer
France France
No Biography provided

Comments and Discussions

 
QuestionGetting the compiled DLL's only... Pinmemberjpope8-Aug-11 5:11 
Generalis there a way to split a mp3 file into several mp3 files in c# Pinmemberlovethisgame5-Mar-11 15:18 
GeneralConverting from WMA to WAV Pinmembersreeju.koothaduth2-Nov-10 4:48 
QuestionHow would you take the wma file and stream to a socket PinmemberDouglas Jauregui31-Dec-09 10:42 
Questionwindows media encoder 9 Pinmemberkayru25-Mar-09 23:27 
AnswerRe: windows media encoder 9 Pinmemberkayru26-Mar-09 0:48 
GeneralRe: windows media encoder 9 PinmemberDouglas Jauregui31-Dec-09 10:38 
QuestionRegarding License !! PinmemberNikhil_777718-Feb-09 9:33 
GeneralConverting Mono Files Pinmembershaktisinh28-Nov-08 19:35 
GeneralConvert wav to wma Pinmembermsurni30-Jul-08 21:22 
GeneralMedia Player make reader files faster PinmemberOmar.Pessoa21-Jul-08 9:04 
GeneralUnable to compile (48 errors) Pinmemberasp-1236-Dec-07 3:21 
QuestionMany many problems when i build PinmemberIbrahim Dwaikat3-Nov-07 14:11 
Hi
 
I am using VS 2005
 
when I Compile it gives me these errors:
 
Error 1 fatal error C1083: Cannot open include file: 'wmsdk.h': No such file or directory
 
Error 2 Invalid Resx file. Could not load file or assembly 'file:///d:\windows media audio compressor\wmacompressor\wmacompressor\mmedia\debug\yeti.wmf.dll' or one of its dependencies. The system cannot find the file specified.
 
Error 3 Type 'WmaUserCtrls.EditWmaWriter' is not defined.
 
Error 4 Type 'WmaUserCtrls.EditWmaWriter' is not defined.
 
Error 6 Type 'WmaWriterConfig' is not defined
 
Error 7 Type 'WmaWriterConfig' is not defined
 

 
what is the solution please
 
Visit Me
 
www.engibrahim.tk

GeneralRuntime error under windows 2000 pro PinmemberahmedoofRashadvich15-Mar-06 5:00 
QuestionBad link in article? PinmemberCodeStalker28-Feb-06 13:45 
AnswerRe: Bad link in article? PinmemberIdael Cardoso10-Mar-06 8:49 
GeneralCannot Compile under Release Pinmemberkgoodrich1-Nov-05 8:57 
GeneralRe: Cannot Compile under Release PinmemberIdael Cardoso30-Dec-05 9:22 
GeneralWav to Wma Compressor using DMO PinsussWmaBoy12-May-05 23:50 
GeneralRe: Wav to Wma Compressor using DMO PinmemberIdael Cardoso3-Jul-05 6:35 
GeneralCorrupted wma files PinmemberGerardo Orozco2-May-05 22:31 
GeneralRe: Corrupted wma files PinmemberIdael Cardoso3-Jul-05 6:28 
QuestionHow to configure compression level Pinmemberfifthnormal27-Nov-04 17:20 
AnswerRe: How to configure compression level PinmemberIdael Cardoso28-Nov-04 9:26 
GeneralRuntime error PinmemberVolen1-Nov-04 5:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.141223.1 | Last Updated 9 Apr 2004
Article Copyright 2004 by Idael Cardoso
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid