将字节数组转换为 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 文件的主要内容,如果未能解决你的问题,请参考以下文章
Python 3:将波形数据(字节数组)转换为浮点值的 numpy 数组