使用 Monogame 获取歌曲 PlayPosition 时出错
Error when getting song PlayPosition using Monogame
我正在尝试获取正在播放的歌曲的当前时间,但是当调用 MediaPlayer.PlayPosition.TotalMilliseconds;
时,出现错误:
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;
...
}
这是在主循环的更新方法中调用的,如下所示:
protected override void Update(GameTime gameTime)
{
base.Update(gameTime);
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
Exit();
if (Keyboard.GetState().IsKeyDown(Keys.Space))
MediaPlayer.Play(Media.song);
SpawnArcker(gameTime);
...
}
我以为是因为我播放的是大的 .wav 文件,但播放短的 .mp3 文件时也是如此。
所以如果有人感兴趣...
过了一段时间,我发现(我猜的)这个错误的意思。在 this page 它说:
0xC00D9C41
#define MF_E_CLOCK_NO_TIME_SOURCE
No Presentation Time Source has been specified.
然后,我搜索了那个错误,发现 this 上面写着:
The presentation clock does not return a valid time until the Media Session sends the MESessionTopologyStatus event with the MF_TOPOSTATUS_READY flag. Until then, GetClock returns MF_E_CLOCK_NO_TIME_SOURCE.
(添加了重点)
我想是这样的事实,即使歌曲是 "Playing",也没有时间,所以会抛出这个错误。
对我来说太多了,所以我选择尝试一个名为 NAudio 的不同库,它具有类似的功能,所以我用这个库重新放置与 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...
}
我正在尝试获取正在播放的歌曲的当前时间,但是当调用 MediaPlayer.PlayPosition.TotalMilliseconds;
时,出现错误:
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;
...
}
这是在主循环的更新方法中调用的,如下所示:
protected override void Update(GameTime gameTime)
{
base.Update(gameTime);
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
Exit();
if (Keyboard.GetState().IsKeyDown(Keys.Space))
MediaPlayer.Play(Media.song);
SpawnArcker(gameTime);
...
}
我以为是因为我播放的是大的 .wav 文件,但播放短的 .mp3 文件时也是如此。
所以如果有人感兴趣...
过了一段时间,我发现(我猜的)这个错误的意思。在 this page 它说:
0xC00D9C41
#define MF_E_CLOCK_NO_TIME_SOURCE
No Presentation Time Source has been specified.
然后,我搜索了那个错误,发现 this 上面写着:
The presentation clock does not return a valid time until the Media Session sends the MESessionTopologyStatus event with the MF_TOPOSTATUS_READY flag. Until then, GetClock returns MF_E_CLOCK_NO_TIME_SOURCE.
(添加了重点)
我想是这样的事实,即使歌曲是 "Playing",也没有时间,所以会抛出这个错误。
对我来说太多了,所以我选择尝试一个名为 NAudio 的不同库,它具有类似的功能,所以我用这个库重新放置与 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...
}