我目前正在使用 NAudio 来捕捉声音,它只创建一个 wav 文件。我正在寻找一种在保存文件之前将其编码为 mp3 的方法。我找到了 LAME,但是当我尝试添加 lame_enc.dll 文件时,它显示“无法添加引用。请确保该文件是可访问的,并且这是一个有效的程序集或 COM 组件”。任何帮助,将不胜感激。
问问题
15750 次
3 回答
11
.Net 4.0 中最简单的方法:
使用 Visual Studio Nuget 包管理器控制台:
Install-Package NAudio.Lame
代码片段:将语音发送到内存流,然后另存为 mp3:
//reference System.Speech
using System.Speech.Synthesis;
using System.Speech.AudioFormat;
//reference Nuget Package NAudio.Lame
using NAudio.Wave;
using NAudio.Lame;
using (SpeechSynthesizer reader = new SpeechSynthesizer()) {
//set some settings
reader.Volume = 100;
reader.Rate = 0; //medium
//save to memory stream
MemoryStream ms = new MemoryStream();
reader.SetOutputToWaveStream(ms);
//do speaking
reader.Speak("This is a test mp3");
//now convert to mp3 using LameEncoder or shell out to audiograbber
ConvertWavStreamToMp3File(ref ms, "mytest.mp3");
}
public static void ConvertWavStreamToMp3File(ref MemoryStream ms, string savetofilename) {
//rewind to beginning of stream
ms.Seek(0, SeekOrigin.Begin);
using (var retMs = new MemoryStream())
using (var rdr = new WaveFileReader(ms))
using (var wtr = new LameMP3FileWriter(savetofilename, rdr.WaveFormat, LAMEPreset.VBR_90)) {
rdr.CopyTo(wtr);
}
}
于 2014-05-30T04:36:33.187 回答
2
该文件lame_enc.dll
是一个非托管 DLL,这意味着您不能只在 .NET 应用程序中添加对它的引用。您需要一个包装器来定义入口点是什么以及如何调用它们。因为lame_enc.dll
我使用了Yeti
包装器,它可以在这篇CodeProject 文章所附的代码中找到。
我发布了有关如何将其用于 MP3 编码的分步说明,以响应以下问题:在 NAudio 的内存流中将格式从 wav 更改为 mp3。那应该让你开始。
于 2013-10-05T21:38:58.157 回答
1
只需将 lame_enc.dll 放在 bin 文件夹中,不要尝试将其添加到引用中。之后尝试此代码。在这里您还可以设置比特率,如 64,128,......
public byte[] ConvertWavToMP3(byte[] bt, uint bitrate)
{
MemoryStream ms = new MemoryStream(bt);
ms.Seek(0, SeekOrigin.Begin);
var ws = new WaveFileReader(ms);
byte[] wavdata = null;
using (MemoryStream wavstrm = new MemoryStream())
using (WaveFileWriter wavwri = new WaveFileWriter(wavstrm, ws.WaveFormat))
{
ws.CopyTo(wavwri);
wavdata = wavstrm.ToArray();
}
WaveLib.WaveFormat fmt = new WaveLib.WaveFormat(ws.WaveFormat.SampleRate, ws.WaveFormat.BitsPerSample, ws.WaveFormat.Channels);
Yeti.Lame.BE_CONFIG beconf = new Yeti.Lame.BE_CONFIG(fmt, bitrate);
byte[] srm = null;
using (MemoryStream mp3strm = new MemoryStream())
using (Mp3Writer mp3wri = new Mp3Writer(mp3strm, fmt, beconf))
{
mp3wri.Write(wavdata, 0, wavdata.Length);
byte[] mp3data = mp3strm.ToArray();
return mp3data;
}
}
于 2013-10-04T09:32:39.317 回答