NAudio是一个开源语音处理库,但中文资料确实很少,还是得看github文档。
在网上搜索NAudio音频文件进行剪切,有的提供了一种方法是一个个字节读,感觉效率不高。另外我只想截取几秒到几秒内的音频,需要将字节换算成时间,还是挺麻烦的。
看源文档提供的范例是这样的
var source = new AudioFileReader("example.mp3");
var trimmed = new OffsetSampleProvider(source) {
SkipOver = TimeSpan.FromSeconds(30),
Take = TimeSpan.FromSeconds(60),
WaveFileWriter.CreateWaveFile16(outputFilePath, trimmed);
这里用到的OffsetSampleProvider,解决了我们的问题。
OffsetSampleProvider允许提取另一个ISampleProvider的片段。通过设置SkipOver可以跳过源ISampleProvider的时间 和设置Take来限制要截断多长时间的片段。你也可以通过设置DelayBy和LeadOut在音频前后增加延迟加长。
还可以支持扩展方法
var trimmed = new AudioFileReader("example.mp3")
.Skip(TimeSpan.FromSeconds(30))
.Take(TimeSpan.FromSeconds(60));
WaveFileWriter.CreateWaveFile16(outputFilePath, trimmed);
除了按时间来截断,也可以通过采样字节数来进行
WaveFileReader source = new WaveFileReader("local.wav");
//与AudioFileReader有区别,WaveFileReader要转成ISampleProvider,下面的SkipOverSamples 与采样率有关系
var trimmed = new OffsetSampleProvider(source.ToSampleProvider())
{
//跳过多少帧
SkipOverSamples = frame,
//截取多少帧
TakeSamples = len
};
上面稍微注意一下是AudioFileReader与WaveFileReader有些区别,请看我上一篇文章:
https://blog.csdn.net/mountainlord/article/details/114769488
官方提供的范例全是写入文件的,有的时候可能会预览某一段音频,如果先保存再播放,会感觉比较别扭,其实生成的OffsetSampleProvider也是继承的ISampleProvider这个接口,所以播放时可以直接使用。
播放某一片段代码如下:
WaveOut m_tempWave = null;
public void PlayFrame(double start, double len)
{
var source = new AudioFileReader("example.mp3");
var trimmed = new OffsetSampleProvider(source) {
SkipOver = TimeSpan.FromSeconds(start),
Take = TimeSpan.FromSeconds(len),
};
m_tempWave = new WaveOut();
m_tempWave.Init(trimmed);
m_tempWave.Play();
}