MediaElement & DispatcherTimer в строго синхронизированном приложении - PullRequest
3 голосов
/ 22 февраля 2012

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

У меня есть MediaElement mediaPlayer, который ищет новую позицию и воспроизводит каждый раз, когда срабатывает таймер диспетчера. Но я замечаю, что mediaPlayer.Position не очень синхронизируется с таймером. В приведенном ниже примере я установил dispatcherTimer, запущенный через 55 секунд, но значение, полученное от MessageBox в timer_Tick, равно 108.276746, то есть с опозданием на 2 секунды (55 + 55 = 110).

private void button1_Click(object sender, RoutedEventArgs e)
        {
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(55);
            timer.Tick += new EventHandler(timer_Tick);
            mediaPlayer.Source = new Uri("test.wma", UriKind.Relative);
            _currentPosition = 55;
            mediaPlayer.Position = TimeSpan.FromSeconds(_currentPosition);

            timer.Start();
        }
void timer_Tick(object sender, EventArgs e)
        {
            MessageBox.Show("Position" + mediaPlayer.Position.TotalSeconds);// print around 108 seconds
        }

Это проблема, потому что мне нужно, чтобы позиция mediaPlayer идеально синхронизировалась с таймером диспетчера.

Для получения дополнительной информации коренная проблема здесь такова: Таймер диспетчера строго следит за ходом mediaElement , потому что мне нужно синхронизировать другие элементы управления с позицией, что mediaPlayer. Опоздание на 2 секунды недопустимо. Кто-нибудь знает, как добиться этого эффекта?

ЦЕЛЬ ОБНОВЛЕНИЯ : Я пытаюсь "переключить изображение иллюстрации" в соответствии с положением воспроизведения от аудио. Например, когда рассказчик прочитал «... У нас красивый дом» в аудио, программа покажет фотографии красивого здания. Но теперь, когда позиция задерживается, она покажет изображение задолго до того, как аудио упомянет о нем.

Ответы [ 3 ]

5 голосов
/ 19 мая 2012

Как указывалось, загрузка элементов мультимедиа занимает время, поэтому нецелесообразно использовать таймер обратного отсчета. Вы должны делать все наоборот: «DispatchTimer» срабатывает примерно 1 или 2 раза в секунду, а когда он срабатывает, вы проверяете положение медиа-элемента. Если он находится в определенной позиции, тогда покажите картинку.

Этот подход также ограничивает максимальную ошибку во временном интервале ваших событий DispatchTimer, предполагая, что система запускает их точно.

1 голос
/ 22 мая 2012

Если вам нужен видеоплеер, который не имеет медленного времени инициализации MediaElement для видео, попробуйте проект Джереми Моррила MediaKit . Он сделал несколько значительных улучшений, включая время загрузки. Он также с открытым исходным кодом, поэтому, если вам нужно больше информации о том, где вы находитесь в видео, вы можете добавить это к источнику.

1 голос
/ 22 февраля 2012

Я много использовал медиа-элемент.

Я подозреваю, что с таймером все в порядке (дайте или возьмите несколько мс) но положение медиаплеера определенно не будет таким, как вы ожидаете.

2 секунды вполне могут быть учтены при загрузке видеофайла и загрузке видео / аудио кодеков. еще больше, если есть какое-либо отставание (процессор или шип оперативной памяти или другое), медиаплеер также будет отставать, пока не будет таймер.

возможно, настроить сценарий, в котором гарантированно будет загружено видео (например, приостановить его где-то в середине видео), затем запустить таймер и воспроизвести видео оттуда, чтобы проверить.

...