2

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

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();
}

==================================================== ====================================

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

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

4

0 回答 0