【问题标题】:Convert byte array to wav file将字节数组转换为 wav 文件
【发布时间】:2011-02-09 13:22:34
【问题描述】:

我正在尝试播放存储在称为字节的字节数组中的 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();
}

【问题讨论】:

  • 出于好奇:你最初是如何得到字节数组中的声音的?
  • 这是一个词典项目的一部分,该项目从merriam-webster.com 下载我词典中每个单词的声音。这里是下载并保存在字节数组中的 wav 文件示例:media.merriam-webster.com/soundc11/g/good0001.
  • 您好 Eyla,能否提供在 android 中将波形格式文件读入字节数组的代码。非常感谢。

标签: c# bytearray wav


【解决方案1】:

试试这个:

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

【讨论】:

  • 感谢您的帮助。您的代码对我有用,并将字节数组转换为 wav 文件并将其保存在给定路径中,但是当我使用时出现问题: System.Media.SoundPlayer myPlayer = new System.Media.SoundPlayer(myfile);播放它会给我一个错误,即:波头已损坏。但是当我使用 windows 媒体播放器播放文件时,它会起作用。有什么建议可以解决这个问题?
  • 我刚刚尝试了您提供的 URL,它有效:new System.Media.SoundPlayer(@"http://media.merriam-webster.com/soundc11/g/good0001").Play(); - 问题可能出在下载代码上?
  • 这里的问题不是数据损坏。 OP 只有原始音频字节。他需要在字节数组之前将 WAV 标头写入文件并补偿大/小端格式。我也在寻找一些干净的代码来执行此操作。
【解决方案2】:

您可以使用类似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() 代码,这将取消构造函数流...
  • 感谢您的帮助。你的代码也有效,我也为你投票。
【解决方案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*/);
    //}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多