【问题标题】:Programmatically getting track length of a song from Windows Media Player以编程方式从 Windows Media Player 获取歌曲的曲目长度
【发布时间】:2011-10-25 19:10:38
【问题描述】:

我想获得一首歌的音轨长度。当我调试它时,我能够获得音轨长度并将其设置为一个名为 songDuration 的字符串变量。但是,当我实际执行它时,它不起作用,字符串为空。我如何使它工作?我已经尝试先初始化变量,但结果仍然相同。我错过了什么?当我逐行调试它时它可以工作,只是不运行它。

代码如下:

wplayer.controls.play();
songDuration = wplayer.currentMedia.durationString;

【问题讨论】:

  • 你能把代码贴在你实际为字符串赋值的地方吗?您还检查过您要使用的对象的文档吗?
  • 发布您将文件(或文件名)分配给 wplayer 的代码。还有更多:什么是 wplayer?请向我们展示您的代码...
  • 字符串 songDuration="";这就是我如何将我的字符串初始化为空白,然后在播放曲目后,我将 songDuration 设置为如上所述的曲目持续时间,但只有在我逐行调试时才能获得持续时间,否则当我运行时它将为空它
  • WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();它的 windows 媒体播放器
  • 也许,您应该在wplayer.currentMedia.durationString 之前稍等片刻。在调试中,播放器有时间启动。

标签: c# media-player


【解决方案1】:

这应该是您正在寻找的属性,它接受一个双精度,因此您需要考虑如何使用您目前拥有的 songDuration 字符串变量:

player.controls.currentPosition

This MSDN article 应该会为您提供更多信息,尽管示例指向在网页中使用控件,但我相信内容应该相似。

另外this SO 问题看起来很相似,但已经包含答案。

【讨论】:

  • 我不要现在的位置,我想知道这首歌有多长
  • 我解决了,L.B 是对的,它走得太快了,它试图在歌曲实际开始之前获取歌曲的长度,我在它之前放了第二个延迟。跨度>
  • 糟糕,注意到您编辑了问题。现在我真的明白你的意思了;)
【解决方案2】:

label3.Text = (wmp.Ctlcontrols.currentPosition).ToString(); label4.Text = wmp.Ctlcontrols.currentItem.duration.ToString();

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,您就可以对任何帖子发表评论。
【解决方案3】:

我发现调用 player.controls.play() 的方法必须退出,并且玩家必须在 .duration 和 .durationString 属性返回正确值而不是空字符串之前实际开始播放几分之一秒0.

这行不通:

wplayer.controls.play();
songDuration = wplayer.currentMedia.durationString;

这也行不通:

wplayer.controls.play();
Application.DoEvents();
System.Threading.Thread.Sleep(100000);
Application.DoEvents();
songDuration = wplayer.currentMedia.durationString;

我通过开始播放媒体并退出方法来解决它,创建一个每 100 毫秒触发一次的 Timer 事件,每次调用它时,它检查持续时间是否仍然为 0,如果不是,它可以捕获持续时间并暂停媒体。另一种方法是使用 AxWindowsMediaPlayer,您可以在其中添加事件处理程序,当媒体状态发生变化并且开始播放时,您可以捕获该事件并查看持续时间。我没有走那条路,也不想采取步骤导入正在使用的任何命名空间。也就是说,这就是 MSFT 的建议:

// Add a delegate for the PlayStateChange event.
player.PlayStateChange += new 
AxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler(player_PlayStateChange);

我没有安装 SDK,而是这样做了。 像这样启动播放器

System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Tick += new EventHandler(GetDuration);
myTimer.Interval = 100;
wplayer.controls.play();
return;

// Check for duration in this other routine which runs every 100 msec until 
// Media Player tells us the duration.

private string GetDuration()
{
    // public variable songDuration declared elsewhere
    songDuration = wplayer.currentMedia.durationString;
    if (songDuration.Length > 0) wplayer.controls.pause();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多