开发者

Using NAudio, Convert an MP3 to wave store it into a Memorystream, read and Play the wave file from the memorystream

开发者 https://www.devze.com 2023-02-20 18:38 出处:网络
Inside the NAudio WaveFileWriter Class, I have implement this method. public static void CreateWaveFile(Stream waveMemoryStream, WaveStream stream)

Inside the NAudio WaveFileWriter Class, I have implement this method.

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

//-----------------------------------------------------------------------------------------------------------------------------

Inside my appplication I have this code

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, s开发者_C百科tart, 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();
}

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

When I click the button, I want to read an MP3 file, convert it to a wavefile, Store the converted wavefile into a memorystream,

Split the converted wavefile, then play the wave file withought saving it to my Hardrive.

0

精彩评论

暂无评论...
验证码 换一张
取 消