使用NAudio音频文件剪切指定片段

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mountainlord

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值