将字节数组转换为wav文件

15

我正在尝试播放存储在名为“bytes”的字节数组中的wav声音。 我知道我应该将字节数组转换为wav文件并将其保存在本地驱动器中,然后调用保存的文件,但我无法将字节数组转换为wav文件。

请帮助我提供示例代码,将wav声音的字节数组转换为wav文件。

这是我的代码:

protected void Button1_Click(object sender, EventArgs e)
{
    byte[] bytes = GetbyteArray();

   //missing code to convert the byte array to wav file

    .....................

    System.Media.SoundPlayer myPlayer = new System.Media.SoundPlayer(myfile);
    myPlayer.Stream = new MemoryStream();
    myPlayer.Play();
}

突然好奇,你最初是如何将声音存储到字节数组中的? - Svish
这是我字典项目的一部分,从http://www.merriam-webster.com/下载每个单词的发音。这里是一个已下载并保存在字节数组中的wav文件示例:http://media.merriam-webster.com/soundc11/g/good0001。 - Eyla
嗨Eyla,你能提供在Android中将wave格式文件读入字节数组的代码吗?非常感谢。 - Joyson
3个回答

13

试试这个:

System.IO.File.WriteAllBytes("yourfilepath.wav", bytes);

谢谢你的帮助。 你的代码对我有用,将字节数组转换为wav文件并保存在给定路径中,但问题是当我使用: System.Media.SoundPlayer myPlayer = new System.Media.SoundPlayer(myfile); 播放时会出现错误,错误信息是:波形头损坏。 但是当我使用Windows Media Player播放文件时,它可以正常工作。 有什么建议可以解决这个问题吗? - Eyla
我刚刚尝试了您提供的URL,它可以正常工作:new System.Media.SoundPlayer(@"http://media.merriam-webster.com/soundc11/g/good0001").Play(); - 也许问题出在下载代码上? - Paul Kohler
4
这里的问题不是数据损坏。 OP只有原始音频字节。他需要在字节数组之前将WAV头写入文件并补偿大/小端格式。我也在寻找一些干净的代码来完成这个任务。 - Raheel Khan
你需要包含文件大小的头文件,所以稍后需要添加它:https://docs.fileformat.com/audio/wav/ - Wesley Long

7
你可以使用类似于File.WriteAllBytes(path, data)的方法,或者......另外,如果你不想写文件,可以将字节数组转换为流,然后播放该流......
var bytes = File.ReadAllBytes(@"C:\WINDOWS\Media\ding.wav"); // as sample

using (Stream s = new MemoryStream(bytes))
{
    // http://msdn.microsoft.com/en-us/library/ms143770%28v=VS.100%29.aspx
    System.Media.SoundPlayer myPlayer = new System.Media.SoundPlayer(s);
    myPlayer.Play();
}

PK :-)


抱歉,我从示例中遗留了 myPlayer.Stream = new MemoryStream() 代码,这将取消构造函数流... - Paul Kohler
谢谢你的帮助。你的代码也有效,我也为你投了赞成票。 - Eyla

3

使用 NAudio,您可以尝试以下操作:

//var wavReader = new WaveFileReader(yourWavFilePath);
//byte[] buffer = new byte[2 * wav1Reader.WaveFormat.SampleRate * wav1Reader.WaveFormat.Channels];
byte[] buffer = YourWaveSoundByteArray;

using ( WaveFileWriter writer = new WaveFileWriter(YourOutputFilePath, new WaveFormat( AssignWaveFormatYouWant /*wavReader.WaveFormat.SampleRate, 16, 2/*how many channel*/))
    )
{
    //int bytesRead;
    //while ((bytesRead = wavReader.Read(buffer, 0, buffer.Length)) > 0)
    //{
        writer.Write(buffer, 0,  buffer.Length/*bytesRead*/);
    //}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接