将字节数组转换为 wav 文件

Posted

技术标签:

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

我正在尝试播放存储在称为字节的字节数组中的 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 中将波形格式文件读入字节数组的代码。非常感谢。 【参考方案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*/);
    //

【讨论】:

以上是关于将字节数组转换为 wav 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将字节数组转换为 wav 文件 <OOURAFFT>

Python 3:将波形数据(字节数组)转换为浮点值的 numpy 数组

在matlab中将音频文件转换为字节数组

如何使用 java 从 pcm 字节数组 .wav 文件中获取频率和音高?

python中的wave库:2个通道和2个样本宽度

将文件转换为字节值数字数组