我正在使用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 格式?