如何使用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();
}
}
您可以帮助我并为我提供代码段吗? 或者只是告诉我在哪里可以找到有用的片段?
答案 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编码器对输入采样率和输出比特率的组合有一些限制,但它处理标准值的公平变化。