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

本文关键字:mp3 文件 保存 网络 音乐 | 更新日期: 2023-09-27 18:01:40

如何使用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();
        }
}

你可以帮助我,并提供我一个代码片段吗?或者直接告诉我在哪里可以找到有用的片段?

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

您可以使用NAudio.Lame中的LameMP3FileWriter进行编码,将其视为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编码器在输入采样率和输出比特率的组合中有一些限制,但它可以处理标准值的公平变化。