我正在尝试在播放时获取歌曲的当前时间,但是当调用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文件也是如此。
答案 0 :(得分:0)
所以如果有人有兴趣......
过了一会儿,我发现(我猜)这个错误的含义。在this page中它说:
0xC00D9C41
#define MF_E_CLOCK_NO_TIME_SOURCE
No Presentation Time Source has been specified.
然后,我搜索该错误并找到this所在的位置:
在媒体会话使用MF_TOPOSTATUS_READY标志发送MESessionTopologyStatus事件之前,演示时钟不会返回有效时间。 在此之前,GetClock返回MF_E_CLOCK_NO_TIME_SOURCE 。
(Emphasys补充说)
我猜是这样的事实,即使这首歌是“正在播放”,也没有时间可以获得,所以这个错误就会被抛出。
对我来说太多了,所以我选择尝试一个名为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...
}