c# - 如何使用 C# NAudio 操作字节?
问题描述
- 我目前能够:记录来自音频输入的数据,在磁盘上使用该数据生成 wav 文件,从磁盘播放 wav。
- 我想要完成的是:获取通过 NAudio 读取的原始字节,将 wav、特定字节转换为 mp3,播放 mp3(不在磁盘上写入任何内容)。
使用的代码:
public WaveIn waveSource = null;
public WaveFileWriter waveFile = null;
public List<byte> soundBytesList = new List<byte>();
private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
{
if (waveFile != null)
for (int i = 0; i < e.BytesRecorded; ++i)
soundBytesList.Add(e.Buffer[i]);
waveFile.Write(e.Buffer, 0, e.BytesRecorded);
waveFile.Flush();
}
public void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
{
if (waveSource != null)
{
waveSource.Dispose();
waveSource = null;
}
if (waveFile != null)
{
waveFile.Dispose();
waveFile = null;
}
}
private void RecordButton_MouseDown(object sender, EventArgs e)
{
waveSource = new WaveIn();
waveSource.WaveFormat = new WaveFormat(44100, 1);
waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
waveFile = new WaveFileWriter("test.wav", waveSource.WaveFormat);
waveSource.StartRecording();
}
private void RecordButton_MouseUp(object sender, EventArgs e)
{
waveSource.StopRecording();
byte[] soundBytesArrayWAV = soundBytesList.ToArray();
byte[] outB = ConvertWavToMp3(soundBytesArrayWAV );
File.WriteAllBytes("test.mp3", outB);
}
public byte[] ConvertWavToMp3(byte[] wavFile)
{
using (var retMs = new MemoryStream())
using (var ms = new MemoryStream(wavFile))
using (var rdr = new WaveFileReader(ms))
using (var wtr = new LameMP3FileWriter(retMs, rdr.WaveFormat, 128))
{
rdr.CopyTo(wtr);
wtr.Flush();
return retMs.ToArray();
}
}
问题是我在 ConvertWavToMp3 方法上得到一个错误,它说提供的字节数组 ( soundBytesArrayWAV
) 没有 RIFF(特定于 wav 的标头)。我的猜测是我没有正确获取 中的所有字节soundBytesList
,因为如果我将所有字节加载到内存中(从磁盘写入 wav),转换工作正常。你能帮我一把吗?
解决方案
根据@Jon Skeet 建议更新的功能代码如下:
public WaveIn waveSource = null;
public WaveFileWriter waveFile = null;
public MemoryStream memStream = null;
private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
{
if (waveFile != null)
{
waveFile.Write(e.Buffer, 0, e.BytesRecorded);
waveFile.Flush();
}
}
public void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
{
if (waveSource != null)
{
waveSource.Dispose();
waveSource = null;
}
if (waveFile != null)
{
waveFile.Dispose();
waveFile = null;
}
}
private void RecordButton_MouseDown(object sender, EventArgs e)
{
waveSource = new WaveIn();
waveSource.WaveFormat = new WaveFormat(44100, 1);
waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
memStream = new MemoryStream();
waveFile = new WaveFileWriter(memStream, waveSource.WaveFormat);
waveSource.StartRecording();
}
private void RecordButton_MouseUp(object sender, EventArgs e)
{
waveSource.StopRecording();
byte[] outB = memStream.ToArray();
File.WriteAllBytes("test.mp3", outB);
}
推荐阅读
- unity3d - 从单色纹理生成网格
- android - 如何为每个按钮实施奖励视频广告
- ruby-on-rails - 在 Rails 中,# frozen_string_literal: true 指令与 StripParams 冲突
- vba - 将新电子邮件导出到文件
- angular - pdf.save 不是 Angular 6 中使用的 jspdf 中的函数错误
- sql-server - 存储过程错误:消息 512,级别 16,状态 1,过程 sp_ActFTC,第 64 行子查询返回超过 1 个值
- java - 活动类中的getArguments()?
- ubuntu - 无法在 ubuntu 14.04 LTS 上升级乘客
- wcf - WCF -“未能查找通道以接收传入消息。找不到端点或 SOAP 操作。” 但仅来自一位客户
- angular - TypeError:未定义不是对象(评估“parentOutlet.peekState”)