使用Monogame获取歌曲PlayPosition时出错

时间:2016-03-22 15:04:29

标签: c# 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文件也是如此。

1 个答案:

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