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有些区别,请看我上一篇文章:
/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();}
如果觉得《使用NAudio音频文件剪切指定片段》对你有帮助,请点赞、收藏,并留下你的观点哦!