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...
}