【问题标题】:How to play an exact part of MP3 file between given positions in ms?如何在 ms 给定位置之间播放 MP3 文件的确切部分?
【发布时间】:2013-09-11 16:03:22
【问题描述】:

(新手问题)

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

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

【问题讨论】:

    标签: c# naudio


    【解决方案1】:

    我将创建一个自定义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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多