Программно получить длину трека песни из Windows Media Player - PullRequest
0 голосов
/ 25 октября 2011

Я хочу получить длину трека песни. Когда я отладил его, я смог получить длину дорожки и установить ее в строковую переменную с именем songDuration. Однако, когда я на самом деле выполняю его, он не работает, строка равна нулю. как мне заставить это работать? Я попытался инициализировать переменные сначала, но все еще тот же результат. Что мне не хватает? Он работает, когда я отлаживаю его построчно, но не запускаю его.

Вот кусок кода:

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

Ответы [ 3 ]

0 голосов
/ 08 июня 2016

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

0 голосов
/ 10 марта 2019

Я считаю, что метод, который вызывает 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;

Я решил это, начав воспроизведение медиафайлов и выйдя из метода.создавая событие Timer, которое срабатывает каждые 100 мсек, и каждый раз, когда оно вызывается, оно проверяет, равно ли длительность 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();
}
0 голосов
/ 25 октября 2011

Это должно быть свойство, которое вы ищете, оно принимает двойное значение, поэтому вам нужно будет принять во внимание, как вы можете использовать строковую переменную songDuration, которая у вас есть в данный момент:

player.controls. currentPosition

Эта статья MSDN должна дать вам больше информации, хотя примеры указывают на использование элемента управления на веб-странице. Я считаю, что содержимое должно быть похожим.

Дополнительно этот ТАК вопрос похож, но уже содержит ответ.

...