C# 使用NAudio,将MP3转换为wave并将其存储到Memorystream,从Memorystream读取并播放wave文件

C# 使用NAudio,将MP3转换为wave并将其存储到Memorystream,从Memorystream读取并播放wave文件,c#,naudio,C#,Naudio,在NAudio WaveileWriter类中,我实现了这个方法 public static void CreateWaveFile(Stream waveMemoryStream, WaveStream stream) { using (WaveFileWriter writer = new WaveFileWriter(waveMemoryStream, stream.WaveFormat)) { byte[] buffer = new by

在NAudio WaveileWriter类中,我实现了这个方法

public static void CreateWaveFile(Stream waveMemoryStream, WaveStream stream)
{
    using (WaveFileWriter writer = 
        new WaveFileWriter(waveMemoryStream, stream.WaveFormat))
    {
        byte[] buffer = new byte[stream.WaveFormat.SampleRate * stream.WaveFormat.Channels * 16];
        while (true)
        {
            int bytesRead = stream.Read(buffer, 0, buffer.Length);
            if (bytesRead == 0)
                break;
            writer.WriteData(buffer, 0, bytesRead);
        }
    }
}
//-----------------------------------------------------------------------------------------------------------------------------

在我的应用程序中,我有以下代码

public void TrimWavFile(string inPath, MemoryStream outPath, TimeSpan cutFromStart, TimeSpan cutFromEnd)
{
    using (Mp3FileReader mp3reader = new Mp3FileReader(inPath))
    {
        WaveStream stream = WaveFormatConversionStream.CreatePcmStream(mp3reader);
        WaveFormat format = stream.WaveFormat;
        MemoryStream waveStream = new MemoryStream();
        WaveFileWriter.CreateWaveFile(waveStream, stream);
        Stream rawStream = new MemoryStream(waveStream.ToArray());

        using (WaveFileReader reader = new WaveFileReader(rawStream))
        {
            using (WaveFileWriter writer = new WaveFileWriter(outPath, reader.WaveFormat))
            {
                int bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond / 1000;
                int startPos = (int)cutFromStart.TotalMilliseconds * bytesPerMillisecond;
                startPos = startPos - startPos % reader.WaveFormat.BlockAlign;
                int endBytes = (int)cutFromEnd.TotalMilliseconds * bytesPerMillisecond;
                endBytes = endBytes - endBytes % reader.WaveFormat.BlockAlign;
                int endPos = (int)reader.Length - endBytes; TrimWavFile(reader, writer, startPos, endPos);
            }
        }
    }
}

private void TrimWavFile(WaveFileReader reader, WaveFileWriter writer, int startPos, int endPos)
{
    reader.Position = startPos;
    byte[] buffer = new byte[1024];

    while (reader.Position < endPos)
    {
        int bytesRequired = (int)(endPos - reader.Position);
        if (bytesRequired > 0)
        {
            int bytesToRead = Math.Min(bytesRequired, buffer.Length);
            int bytesRead = reader.Read(buffer, 0, bytesToRead);
            if (bytesRead > 0)
            {
                writer.WriteData(buffer, 0, bytesRead);
            }
        }
    }
}

private void button5_Click(object sender, EventArgs e)
{
    TimeSpan start = new TimeSpan(0, 3, 0);
    TimeSpan end = new TimeSpan(0, 2, 0);

    MemoryStream temp = new MemoryStream();

    TrimWavFile(filename, temp, start, end);

    Stream rawStream = new MemoryStream(temp.ToArray());
    RawSourceWaveStream rawSourceStream = new RawSourceWaveStream(rawStream,new WaveFormat());
    WaveStream wavestream = rawSourceStream;
    WaveStream stream = WaveFormatConversionStream.CreatePcmStream(new WaveFileReader(wavestream));
    waveOut.Init(stream);
    waveOut.Play();
}
公共文件(字符串输入路径、内存流输出路径、TimeSpan cutFromStart、TimeSpan cutFromEnd)
{
使用(Mp3FileReader mp3reader=新的Mp3FileReader(inPath))
{
WaveStream=波形转换流。CreatePcmStream(mp3reader);
波形格式=stream.WaveFormat;
MemoryStream waveStream=新的MemoryStream();
创建波形文件(waveStream,stream);
Stream rawStream=newmemoryStream(waveStream.ToArray());
使用(WaveFileReader=新的WaveFileReader(rawStream))
{
使用(waveilewriter=新的waveilewriter(outPath,reader.WaveFormat))
{
int bytespermillissecond=reader.WaveFormat.AverageBytesPerSecond/1000;
int startPos=(int)cutFromStart.totalmillizes*bytespermillissecond;
startPos=startPos-startPos%reader.WaveFormat.BlockAlign;
int endBytes=(int)cutFromEnd.totalmillizes*bytespermillissecond;
endBytes=endBytes-endBytes%reader.WaveFormat.BlockAlign;
int endPos=(int)reader.Length-endBytes;TrimWavFile(reader、writer、startPos、endPos);
}
}
}
}
专用文件(波形文件读取器、波形文件写入器、int startPos、int endPos)
{
reader.Position=startPos;
字节[]缓冲区=新字节[1024];
while(reader.Position0)
{
int bytesToRead=Math.Min(bytesRequired,buffer.Length);
int bytesRead=reader.Read(缓冲区,0,bytesToRead);
如果(字节读取>0)
{
WriteData(缓冲区,0,字节读取);
}
}
}
}
私有无效按钮5_单击(对象发送者,事件参数e)
{
TimeSpan开始=新的TimeSpan(0,3,0);
TimeSpan结束=新的TimeSpan(0,2,0);
MemoryStream temp=新的MemoryStream();
文件(文件名、临时、开始、结束);
Stream rawStream=新内存流(temp.ToArray());
RawSourceWaveStream rawSourceStream=新的RawSourceWaveStream(rawStream,new WaveFormat());
WaveStream WaveStream=原始源流;
WaveStream=波形转换流。CreatePcmStream(新的波形文件读取器(WaveStream));
waveOut.Init(流);
waveOut.Play();
}
=====================================================================================

当我点击按钮时,我想读取MP3文件,将其转换为波形文件,将转换后的波形文件存储到memorystream中


拆分转换后的波形文件,然后播放波形文件,并将其保存到我的硬盘。

对此您有什么问题,还是只想与我们共享?抱歉,不清楚。我有个问题。我正在尝试将mp3转换为波形文件,修剪波形文件,然后播放修剪后的波形文件。我正在将所有内容保存在内存流中。代码编写得很好,但音乐无法播放。您对此有问题吗,还是只是想与我们分享?抱歉,不清楚。我有个问题。我正在尝试将mp3转换为波形文件,修剪波形文件,然后播放修剪后的波形文件。我正在将所有内容保存在内存流中。代码编写得很好,但音乐无法播放。