2013-05-22 3 views
1

Je veux faire quelques changements sur le fichier Wave, puis le jouer directement après cela.Wave Header corrompu

Je définir un tableau d'octets pour stocker les octets de fichier wave sur comme suit:

byte[] byteArr; 
byteArr = File.ReadAllBytes(dlg.FileName); 

où DLG est un dialogue OpenFile.

Ensuite, je fais un changement de débit binaire échantillon de la vague comme suit:

private void playSlectedWave_Click(object sender, EventArgs e) 
{ 
    int sample = 50000; 
    MemoryStream fs = new MemoryStream(byteArr); 
    BinaryReader br = new BinaryReader(fs); 
    int length = (int)fs.Length-8; 
    fs.Position = 22; 
    short channels = br.ReadInt16(); 
    fs.Position = 34; 
    short BitsPerSample = br.ReadInt16(); 
    byte[] arrfile = new byte[fs.Length]; 
    fs.Position = 0; 
    fs.Read(arrfile, 0, arrfile.Length); 
    BinaryWriter bw = new BinaryWriter(fs); 
    bw.BaseStream.Seek(0, SeekOrigin.Begin); 
    bw.Write(arrfile, 0, 24); 
    bw.Write(sample); 
    bw.Write((int)(sample* ((BitsPerSample * channels)/8))); 
    bw.Write((short)((BitsPerSample * channels)/8)); 
    bw.Write(arrfile, 34, arrfile.Length - 34); 
    SoundPlayer SP = new SoundPlayer(fs); 
    SP.Play(); 
} 

Ma question est que lorsqu'il atteint la SP.Play() il jette une exception qui dit que l'en-tête d'onde est corrompu.

Pour plus d'informations, j'essaie le code précédent mais avec FileStream au lieu de MemoryStream et ça marche bien pour moi.

Est-ce que quelqu'un sait pourquoi?

+0

Heath @ Mark peut vous aider ici:) – superuser

+0

@MattJohnson no. Votre dernière déclaration ne tient pas. –

+0

@MattJohnson quand j'ai cherché que j'ai trouvé que je dois modifier seulement La valeur de ByteRate et BlockAlign quand je change le sampleRate et je fais cela ci-dessus. – superuser

Répondre

1

Essayez:

SP.Stream.Position = 0; 

Il était une solution au moins pour ma situation.

1

Définissez votre SoundPlayer SP en dehors de votre sous/fonction ou utiliser

SP.PlaySync 

SP.Play(); 

est-Async, après avoir frappé cette ligne vous laisse la Sous alors qu'il est encore en cours de lecture en arrière-plan et la La mémoire est probablement modifiée ou retirée de la mémoire.

Vous êtes chanceux que vous obteniez seulement une exception, il y a une possibilité que votre programme tombe en panne même lors du débogage sans aucune exception.

0

Mettez en forme le fichier audio souhaité correctement dans un fichier .wav!

Je pensais que cela fonctionnerait:

soundPlayer.Stream.Position = 0; 

Mais malheureusement, il a compilé en vain ...

Essayez ce site pour mettre en forme: http://audio.online-convert.com/convert-to-wav