【发布时间】:2013-09-11 16:03:22
【问题描述】:
(新手问题)
NAudio 允许从给定位置开始播放 MP3 文件(通过使用 Waveformat.AverageBytesPerSecond 将其从 ms 转换为字节),但是否可以使其停止在另一个给定位置精确播放(以毫秒为单位)?我必须以某种方式操纵波流还是有更简单的方法?
有一个解决方案同时使用Timer,同时在计时器计时后开始播放和停止播放,但它根本不会产生可靠的结果。
【问题讨论】:
(新手问题)
NAudio 允许从给定位置开始播放 MP3 文件(通过使用 Waveformat.AverageBytesPerSecond 将其从 ms 转换为字节),但是否可以使其停止在另一个给定位置精确播放(以毫秒为单位)?我必须以某种方式操纵波流还是有更简单的方法?
有一个解决方案同时使用Timer,同时在计时器计时后开始播放和停止播放,但它根本不会产生可靠的结果。
【问题讨论】:
我将创建一个自定义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);
【讨论】: