如何将音乐网络流保存为mp3文件?

时间:2014-05-03 06:58:21

标签: c# mp3 bytearray naudio pcm

如何使用NAudio将流(作为byte[]样本到达并编码为PCM)保存到mp3文件?我已经听说过新的Naudio Lame编码器,但并没有真正理解它。

我已经在网上搜索过但没有找到有用的东西。

我现在正在玩这条小溪:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using NAudio;

namespace PLAYER
{
    class NAudioPlayer : Player
    {
        NAudio.Wave.BufferedWaveProvider buf;
        NAudio.Wave.IWavePlayer player;
        int times = 0;

        public int EnqueueSamples(int channels, int rate, byte[] samples, int frames)
        {
            if (buf == null)
            {
                buf = new NAudio.Wave.BufferedWaveProvider(new   NAudio.Wave.WaveFormat(rate, channels));
                NAudio.Wave.WaveOut dso = new NAudio.Wave.WaveOut();
                dso.Init(buffer);
                dso.Play();
                player = dso;
            }
            int space = buf.BufferLength - buf.BufferedBytes;
            if (space > samples.Length)
            {
                if (times == 0)
                times = (times + 1) % 100;
                buf.AddSamples(samples, 0, samples.Length);
                return frames;
            }
            return 0;
        }
        public void Reset()
        {
            if (buffer != null) buffer.ClearBuffer();
        }
}

您可以帮助我并为我提供代码段吗? 或者只是告诉我在哪里可以找到有用的片段?

1 个答案:

答案 0 :(得分:0)

您可以使用LameMP3FileWriter中的NAudio.Lame进行编码,方法是将其视为Stream并将样本写入其中。

这是一个袖手旁观的例子:

    LameMP3FileWriter mp3writer = null;
    WaveFormat mp3format = null;

    public void StartMP3Encoding(string filename, WaveFormat format)
    {
        if (mp3writer != null)
            StopMP3Encoding();

        mp3format = format;
        mp3writer = new LameMP3FileWriter(filename, format, 128);
    }

    public void StopMP3Encoding()
    {
        if (mp3writer != null)
        {
            mp3writer.Dispose();
            mp3writer = null;
        }
    }

    public int EnqueueSamples(int channels, int rate, byte[] samples, int frames)
    {
        if (mp3writer != null && mp3format.Channels == channels)
            mp3writer.Write(samples, 0, samples.Length);

        return frames;
    }

如果要开始录制MP3文件,请使用要录制的文件名和数据格式调用StartMP3Encoding。完成后,请致电StopMP3Encoding以关闭编码器。在两者之间,在收到的样品到达时写入。

LAME编码器不是时间宝贵的,因此您可以尽可能慢地将数据运送到它,或者尽可能快地使用数据对其进行爆炸。

LAME编码器对输入采样率和输出比特率的组合有一些限制,但它处理标准值的公平变化。