2010-10-05 20 views
1

Je travaille depuis quelque temps avec des formats d'image et je sais qu'une image est un tableau de pixels (24- peut-être 32 bits). La question est: comment est représenté un fichier sonore? Pour être honnête je ne suis même pas sûr de ce que je devrais googler pour. Aussi, je serais intéressé comment utilisez-vous les données, je veux dire en fait jouer les sons dans le fichier. Pour un fichier image, vous avez toutes sortes de périphériques abstraits pour dessiner une image sur (Graphics: java, C#, HDC: cpp (win32), etc.). J'espère avoir été assez clair.Lecture de sons bruts

Répondre

2

Voici un aperçu dandy de la façon dont .wav est stocké. Je l'ai trouvé en tapant "format de fichier wave" dans google.

http://www.sonicspot.com/guide/wavefiles.html

+0

Merci pour la réponse man. J'ai trouvé que le wav est l'équivalent d'un BMP plus ou moins (sans compression). –

1

fichiers WAV peuvent également stocker des fichiers audio compressés, mais je crois que la plupart du temps, ils ne sont pas compressés. Mais le format WAV est conçu comme un conteneur pour un certain nombre d'options sur la façon dont cet audio est stocké.

Voici un code coupé que j'ai trouvé à une autre question ici à stackoverflow que j'aime en C# qui construit un format audio WAV MemoryStream puis joue ce flux (sans l'enregistrer dans un fichier, comme beaucoup d'autres réponses comptent). Mais l'enregistrer dans un fichier peut facilement être ajouté avec une ligne de code si vous voulez l'enregistrer sur le disque, mais je pense que la plupart du temps, ce serait indésirable.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Windows.Forms; 

public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383) 
{ 
    var mStrm = new MemoryStream(); 
    BinaryWriter writer = new BinaryWriter(mStrm); 

    const double TAU = 2 * Math.PI; 
    int formatChunkSize = 16; 
    int headerSize = 8; 
    short formatType = 1; 
    short tracks = 1; 
    int samplesPerSecond = 44100; 
    short bitsPerSample = 16; 
    short frameSize = (short)(tracks * ((bitsPerSample + 7)/8)); 
    int bytesPerSecond = samplesPerSecond * frameSize; 
    int waveSize = 4; 
    int samples = (int)((decimal)samplesPerSecond * msDuration/1000); 
    int dataChunkSize = samples * frameSize; 
    int fileSize = waveSize + headerSize + formatChunkSize + headerSize + dataChunkSize; 
    // var encoding = new System.Text.UTF8Encoding(); 
    writer.Write(0x46464952); // = encoding.GetBytes("RIFF") 
    writer.Write(fileSize); 
    writer.Write(0x45564157); // = encoding.GetBytes("WAVE") 
    writer.Write(0x20746D66); // = encoding.GetBytes("fmt ") 
    writer.Write(formatChunkSize); 
    writer.Write(formatType); 
    writer.Write(tracks); 
    writer.Write(samplesPerSecond); 
    writer.Write(bytesPerSecond); 
    writer.Write(frameSize); 
    writer.Write(bitsPerSample); 
    writer.Write(0x61746164); // = encoding.GetBytes("data") 
    writer.Write(dataChunkSize); 
    { 
     double theta = frequency * TAU/(double)samplesPerSecond; 
     // 'volume' is UInt16 with range 0 thru Uint16.MaxValue (= 65 535) 
     // we need 'amp' to have the range of 0 thru Int16.MaxValue (= 32 767) 
     // so we simply set amp = volume/2 
     double amp = volume >> 1; // Shifting right by 1 divides by 2 
     for (int step = 0; step < samples; step++) 
     { 
      short s = (short)(amp * Math.Sin(theta * (double)step)); 
      writer.Write(s); 
     } 
    } 

    mStrm.Seek(0, SeekOrigin.Begin); 
    new System.Media.SoundPlayer(mStrm).Play(); 
    writer.Close(); 
    mStrm.Close(); 
} // public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383) 

Mais ce code montre un peu de perspicacité dans le format WAV, et il est même le code qui permet à une personne de construire votre propre format WAV dans le code source C#.