Как я могу использовать LAME для кодирования wav в mp3 С#

В настоящее время я использую NAudio для захвата звука, и он создает только файл wav. Я ищу способ закодировать его в mp3 перед сохранением файла. Я нашел LAME, но когда я пытаюсь добавить файл lame_enc.dll, он говорит: «Не удалось добавить ссылку. Пожалуйста, убедитесь, что файл доступен, и что это допустимая сборка или COM-компонент». Любая помощь будет оценена по достоинству.


person user2843871    schedule 03.10.2013    source источник
comment
codeproject.com/Articles/ 501521/   -  person MichaC    schedule 03.10.2013


Ответы (3)


Самый простой способ в .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);
    }
}
person JJ_Coder4Hire    schedule 30.05.2014
comment
retMs ничего не делает в этом примере? - person Stuart.Sklinar; 20.04.2015

Файл lame_enc.dll является неуправляемой библиотекой DLL, а это означает, что вы не можете просто добавить ссылку на него в свое приложение .NET. Вам нужна оболочка, чтобы определить, что такое точки входа и как они называются. Для lame_enc.dll я использую оболочку Yeti, которую можно найти в коде, прикрепленном к < strong>эта статья CodeProject.

Я опубликовал пошаговое описание того, как использовать это для кодирования MP3 в ответ на вопрос: изменить формат с wav на mp3 в потоке памяти в NAudio. Это должно заставить вас начать.

person Corey    schedule 05.10.2013

Просто поместите 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;
        }
       }
person sainath sagar    schedule 04.10.2013