MediaElement и DispatcherTimer в строго синхронизирующем приложении

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

У меня есть MediaElement mediaPlayer, который ищет новую позицию и воспроизводится каждый раз, когда срабатывает таймер Dispatcher. Но я замечаю, что 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 секунды недопустимо. Кто-нибудь знает, как добиться этого эффекта?

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


person Hoàng Long    schedule 22.02.2012    source источник


Ответы (3)


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

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

person kevin    schedule 19.05.2012
comment
моя рабочая станция сломана и не может воспроизводить мультимедиа после переустановки, поэтому я думаю, что это займет немного больше времени. Просто чтобы вы знали, что я не забываю этот вопрос. - person Hoàng Long; 25.05.2012

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

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

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

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

person Anton    schedule 22.02.2012
comment
как я могу гарантировать, что видео загрузилось? Техника паузы, кажется, не работает. - person Hoàng Long; 22.02.2012

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

person erodewald    schedule 22.05.2012