Подтвердить что ты не робот

Как определить, играет ли MediaElement?

Кажется, достаточно просто, но я не могу понять, каким образом состояние MediaElement. Существуют различные свойства для некоторых состояний (например, IsBuffering), но я не могу найти их для таких состояний, как Play, Pause и т.д. Silverlight, похоже, имеет свойство CurrentState, которое показывает все это.

В настоящее время способ определения того, должно ли видео воспроизводиться, - наблюдать за различными событиями и таймером, который проверяет, достигнут ли какой-либо прогресс.

Я новичок в MediaElement и WPF (на самом деле я использую MediaElement в приложении WinForms). Что-то мне не хватает?

4b9b3361

Ответ 1

Вам ничего не хватает. Вы в значительной степени должны вручную отслеживать, воспроизводится ли медиа. Жаль, так как в Silverlight это так просто, как вы упомянули. Похоже на серьезный надзор для меня.

Ответ 2

Вы можете получить член _currentState, используя отражение.

    private MediaState GetMediaState(MediaElement myMedia)
    {
        FieldInfo hlp = typeof(MediaElement).GetField("_helper", BindingFlags.NonPublic | BindingFlags.Instance);
        object helperObject = hlp.GetValue(myMedia);
        FieldInfo stateField = helperObject.GetType().GetField("_currentState", BindingFlags.NonPublic | BindingFlags.Instance);
        MediaState state = (MediaState)stateField.GetValue(helperObject);
        return state;
    }

Это охватывает воспроизведение/паузу, но не изменяется от "play" до "stop", когда оно заканчивается.

Вы можете обойти это, добавив обработчик событий в событие MediaEnded и запустив метод .Stop(), это правильно изменит статус (который может быть выбран методом выше)

Ответ 3

Что я сделал, чтобы "работать", это был подкласс MediaPlayer (это тоже будет работать для MediaElement) и добавить мои собственные методы в Play/Pause/Stop. В этих методах я сохраняю поле, которое представляет статус воспроизведения. Кроме того, вам необходимо подключить MediaEnded, чтобы вы могли изменить статус с "воспроизведения" на "остановлено".

Ответ 4

if (YourMediaElementName.CurrentState == MediaElementState.Playing)           {

используйте это условие, чтобы проверить, воспроизводится ли состояние или приостанавливается

Ответ 5

Я нашел одно решение, которое woking на Универсальной платформе Windows 10:

 if ( yourMediaElement.CurrentState.ToString() == "Playing" ) {
 //nou yourMediaElement is playng
   }

Ответ 6

Для WPF MediaElement, это решение/обходной путь, который я использую:

bool IsPlaying()
{
    var pos1 = wpfMediaElement.Position;
    System.Threading.Thread.Sleep(1);
    var pos2 = wpfMediaElement.Position;

    return pos2 != pos1;
}