首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用LAME将wav编码为mp3 c#

如何使用LAME将wav编码为mp3 c#
EN

Stack Overflow用户
提问于 2013-10-04 02:08:45
回答 3查看 15.6K关注 0票数 6

我目前正在使用NAudio来捕获声音,它只创建一个wav文件。我正在寻找一种方法,以编码为一个mp3之前保存的文件。我发现LAME,但每当我尝试添加lame_enc.dll文件时,它都会显示“无法添加引用。请确保该文件是可访问的,并且是有效的程序集或COM组件”。任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2014-05-30 12:36:33

在.Net 4.0中最简单的方法:

使用visual studio Nuget包管理器控制台:

代码语言:javascript
运行
复制
Install-Package NAudio.Lame

代码片段:将语音发送到内存流,然后另存为mp3:

代码语言:javascript
运行
复制
//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);
    }
}
票数 11
EN

Stack Overflow用户

发布于 2013-10-06 05:38:58

文件lame_enc.dll是一个非托管的DLL,这意味着您不能只在.NET应用程序中添加对它的引用。您需要一个包装器来定义入口点是什么以及如何调用它们。对于lame_enc.dll,我使用了Yeti包装器,它可以在 CodeProject article.附带的代码中找到

为了回答这个问题:change format from wav to mp3 in memory stream in NAudio,我一步一步地介绍了如何将其用于MP3编码。这应该会让你开始学习。

票数 2
EN

Stack Overflow用户

发布于 2013-10-04 17:32:39

只需将lame_enc.dll放在bin文件夹中,不要尝试将其添加到引用中。在此之后,请尝试此代码。在这里你也可以设置比特率,如64,128,.....

代码语言:javascript
运行
复制
    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;
        }
       }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19166140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档