我正在创建一个应用程序,需要允许用户在文件播放时选择音频文件的播放位置。但是,一旦位置发生变化,我就无法确定当前位置。
这是一个示例程序,显示了我如何去做。
using NAudio.Utils;
using NAudio.Wave;
using System;
namespace NAudioTest
{
class Program
{
static void Main()
{
var audioFileReader = new AudioFileReader("test.mp3");
var waveOutEvent = new WaveOutEvent();
waveOutEvent.Init(audioFileReader);
waveOutEvent.Play();
while (true)
{
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter)
{
var playLocationSeconds =
waveOutEvent.GetPositionTimeSpan().TotalSeconds;
Console.WriteLine(
"Play location is " + playLocationSeconds + "seconds");
}
else if (key.Key == ConsoleKey.RightArrow)
{
audioFileReader.CurrentTime =
audioFileReader.CurrentTime.Add(TimeSpan.FromSeconds(30));
}
else
{
break;
}
}
}
}
}
重现问题的步骤
我试过获取AudioFileReader.CurrentTime的值,而不是在WaveOutEvent上调用GetPositionTimeSpan。这种方法的问题在于AudioFileReader.CurrentTime值在跳转中进行,可能是因为当与WaveOutEvent一起使用时,此基础流被缓冲,因此CurrentTime不能准确地反映播放位置,只能反映底层流中的位置。
如何支持任意游戏定位,并继续获得准确的游戏位置当前时间?
音频文件阅读器的“CurrentTime”属性足以告诉当前的播放位置,特别是如果您的延迟不是很高。我发现它和waveOutEvent.GetPositionTimeSpan()之间的区别是100-200毫秒。最多。
您确实使用CurrentTime属性的setter在流中重新定位。使用getter然后查询当前位置也是一致的。如果您关注精度,则可以使用较低的延迟。
扩展方法“GetPositionTimeSpan()”似乎确实返回到目前为止的播放总长度而不是流中的位置。不可否认,我不知道为什么会这样。