如何在给定位置之间播放 MP3 文件的确切部分(毫秒)

本文关键字:切部 毫秒 文件 MP3 定位 位置 播放 之间 | 更新日期: 2023-09-27 18:31:01

(新手问题)

NAudio 允许从给定位置开始播放 MP3 文件(通过使用 Waveformat.AverageBytesPerSecond 将其从毫秒转换为字节),但是是否可以使其在另一个给定位置(以毫秒为单位)完全停止播放?我是否必须以某种方式操纵波流或有更简单的方法?

有一种解决方案同时使用Timer,在计时器滴答作响后开始播放和停止播放,但它根本不会产生可靠的结果。

如何在给定位置之间播放 MP3 文件的确切部分(毫秒)

我会创建一个自定义IWaveProvider,该最多只从Read返回指定数量的字节。然后将 Mp3FileReader 重新定位到开头,并将其传递给自定义修剪波形提供程序

这里有一些完全未经测试的示例代码,可以给你一个想法。

 class TrimWaveProvider
 {
     private readonly IWaveProvider source;
     private int bytesRead;
     private readonly int maxBytesToRead;
     public TrimWaveProvider(IWaveProvider source, int maxBytesToRead)
     { 
         this.source = source;
         this.maxBytesToRead = maxBytesToRead;
     }
     public WaveFormat WaveFormat { get { return source.WaveFormat; } }
     public int Read(byte[] buffer, int offset, int bytesToRead)
     {
         int bytesToReadThisTime = Math.Min(bytesToRead, maxBytesToRead - bytesRead);
         int bytesReadThisTime = source.Read(buffer, offset, bytesToReadThisTime);
         bytesRead += bytesReadThisTime;
         return bytesReadThisTime;
     }
 }
 // and call it like this...
 var reader = new Mp3FileReader("myfile.mp3");
 reader.Position = reader.WaveFormat.AverageBytesPerSecond * 3; // start 3 seconds in
 // read 5 seconds
 var trimmer = new TrimWaveProvider(reader, reader.WaveFormat.AverageBytesPerSecond * 5);
 WaveOut waveOut = new WaveOut();
 waveOut.Init(trimmer);