C# 使用Monogame获取歌曲播放位置时出错

C# 使用Monogame获取歌曲播放位置时出错,c#,monogame,C#,Monogame,我试图在播放歌曲时获取歌曲的当前时间,但调用MediaPlayer.PlayPosition.totalms时,将抛出一个错误: An unhandled exception of type 'SharpDX.SharpDXException' occurred in SharpDX.dll Additional information: HRESULT: [0xC00D9C41], Module: [Unknown], ApiCode: [Unknown/Unk

我试图在播放歌曲时获取歌曲的当前时间,但调用
MediaPlayer.PlayPosition.totalms时,将抛出一个错误:

An unhandled exception of type 'SharpDX.SharpDXException' occurred in SharpDX.dll

Additional information: 
    HRESULT: [0xC00D9C41], 
    Module: [Unknown], 
    ApiCode: [Unknown/Unknown], 
    Message: Unknown
我正在学习
c#
monogame
,也许我犯了一个明显的错误

引发该错误的代码如下所示:

public static void SpawnArcker(GameTime gametime)
{
    if (MediaPlayer.State != MediaState.Playing) return;

    elapsedtime += (float) MediaPlayer.PlayPosition.TotalMilliseconds; // <--- HERE
    //elapsedtime += (float) gametime.ElapsedGameTime.TotalMilliseconds;
    ...
}

我认为这是因为我在播放大的.wav文件,但短的.mp3文件也会出现这种情况。

所以如果有人感兴趣

过了一会儿,我发现(我猜)这个错误的意思。信中说:

然后,我搜索该错误并找到它的位置:

在媒体会话发送带有MF_TOPOSTATUS_READY标志的MESessionTopologyStatus事件之前,演示时钟不会返回有效时间在此之前,GetClock返回MF\u E\u CLOCK\u NO\u TIME\u SOURCE

(新增)

我猜事实是,即使歌曲正在“播放”,也没有时间获得,因此抛出了这个错误

对我来说太多了,所以我选择尝试另一个具有类似功能的库,因此我用这个库重新嵌入了与
MediaPlayer
相关的所有内容,并且使用相同的逻辑,现在它可以工作了。以下是我所做的一些更改:

public static void SpawnArcker(WaveOutEvent waveOutDevice, Mp3FileReader audioFileReader)
{
    if (waveOutDevice.PlaybackState != PlaybackState.Playing) return;

    elapsedtime += (float) audioFileReader.CurrentTime.TotalMilliseconds - aux_elapsedtime;
    aux_elapsedtime = (float) audioFileReader.CurrentTime.TotalMilliseconds;
    //... rest of code...
}

你能解释一下为什么不使用
elapsedtime+=(float)gametime.ElapsedGameTime.total毫秒?我认为它可以很好地工作。@J3soon您好,是的,它可以工作,但我正在制作一个基于节奏的游戏,如果我使用
gametime,我需要歌曲中经过的时间。ElapsedGameTime
游戏每次运行时都会以不同的方式与歌曲不同步,所以我认为获得歌曲的elapsedTime会更好…谢谢!事实上,我在C++中使用
GetClock
GetCorrelatedTime
与媒体会话时也出现了同样的错误。经过一番努力之后,我发现文档中似乎有一个错误:当我等待
MF\u TOPOSTATUS\u READY
时,我仍然会遇到同样的错误,当我等待
MF\u TOPOSTATUS\u STARTED\u SOURCE
时,我没有(最后…),这对我来说很有意义:当歌曲还没有开始播放时,你不能请求播放时间。我希望这对某人有用!(或者,您可以等待
MESessionStarted
0xC00D9C41
#define MF_E_CLOCK_NO_TIME_SOURCE
No Presentation Time Source has been specified.
public static void SpawnArcker(WaveOutEvent waveOutDevice, Mp3FileReader audioFileReader)
{
    if (waveOutDevice.PlaybackState != PlaybackState.Playing) return;

    elapsedtime += (float) audioFileReader.CurrentTime.TotalMilliseconds - aux_elapsedtime;
    aux_elapsedtime = (float) audioFileReader.CurrentTime.TotalMilliseconds;
    //... rest of code...
}