0

我正在使用NAudio库。我在下面写了一个函数,它WaveStream会剪切一段音频,例如,我可以用它剪切 30 秒的音乐文件,如下图所示:

在此处输入图像描述

public static IWaveProvider CutAudio(WaveStream wave, 
                                     TimeSpan startPosition, 
                                     TimeSpan endPosition) {

    ISampleProvider sourceProvider = wave.ToSampleProvider();
    long currentPosition = wave.Position; // Save stream position

    // Take audio from the beginning of file until {startPosition}
    OffsetSampleProvider offset1 = new OffsetSampleProvider(sourceProvider) {
        Take = startPosition
    };

    // Take audio after {endPosition} until the end of file
    OffsetSampleProvider offset2 = new OffsetSampleProvider(sourceProvider) {
        SkipOver = (endPosition - startPosition),
        Take = TimeSpan.Zero
    };

    wave.Position = currentPosition; // Restore stream position
    return (offset1.FollowedBy(offset2)).ToWaveProvider();

}

这是一个示例用法:

 string sourceFile = "C:\\File.mp3";
 string outputFile = "C:\\Output.wav"; // It must be a WAVE file

 using (AudioFileReader reader = new AudioFileReader(sourceFile))
 {
     TimeSpan startPosition = TimeSpan.Parse("00:00:05.000");
     TimeSpan endPosition = TimeSpan.Parse("00:00:10.000");
     IWaveProvider wave = CutAudio(reader, startPosition, endPosition);

     WaveFileWriter.CreateWaveFile(outputFile, wave);
 }

它通过将一个Mp3FileReader或一个AudioFileReader类作为参数传递给函数来处理 MP3 文件,但这个函数的问题是它将 MP3 文件转换为 WAVE 格式,所以一旦在音频中应用了剪辑,我需要将其保存为新的 WAVE文件。

我知道NAudio可以使用该类解析 MP3 样本Mp3FileReader,所以我想通过使用Mp3FileReader.ReadNextFrame()和写入新的 MP3 文件直接对 MP3 文件流进行剪切(和其他修改),而不是花费时间和磁盘空间来转换为 WAVE 格式并编写 WAVE 文件。

我看到了一些使用Mp3FileReader.ReadNextFrame().

我的问题是:在 C# 或 VB.NET 中,如何调整上述功能以处理 MP3 文件/Mp3FileReader而不将它们转换为 WAVE 格式?

4

0 回答 0