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?
Heath @ Mark peut vous aider ici:) – superuser
@MattJohnson no. Votre dernière déclaration ne tient pas. –
@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