Прогресс Silverlight MediaElement - PullRequest
3 голосов
/ 08 июля 2010

Я пытаюсь создать собственный медиаплеер в Silverlight. Я работаю в Progress Bar. Я хочу, чтобы индикатор выполнения отображал текущий прогресс загрузки, а также текущую позицию MediaElement во время воспроизведения.

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

Я установил значение для обоих в процентах от 100.

Например:

ProgressBar.Value = MediaElement.DownloadProgress;
Slider.Value = (MediaElement.Position.TotalMilliseconds) / (MediaElement.NaturalDuration.TimeSpan.TotalMilliseconds);

Проблема в том, что значение Slider.Value становится больше, чем значение ProgressBar.Value. Как это возможно? Как я могу воспроизводить видео на более удаленном месте, чем то, что было загружено?

Какой-нибудь совет, как правильно их синхронизировать?

Спасибо.

1 Ответ

4 голосов
/ 09 июля 2010

Это возможно, потому что алгоритмы сжатия видеопотока не приводят к количеству байтов, пропорциональному времени. Возьмем, к примеру, видеофайл размером 300 МБ, который работает, скажем, 60 минут, но это не означает, что через 30 минут в файле будет 150 МБ.

Если первая часть видео является относительно "тихой", вероятно, она будет хорошо сжиматься, тогда как более загруженные участки позже могут сжиматься не так хорошо. В результате можно загрузить только небольшой процент от размера файла и при этом воспроизвести больший процент от общего времени воспроизведения.

Редактировать

Так как мне заставить их синхронизироваться?

Вы обманываете его, ограничивая ползунок минимумом прогресса загрузки или времени.

Slider.Value = Math.Min(mediaelement.Position.TotalMilliseconds / mediaelement.NaturalDuration.TimeSpan.TotalMilliseconds, mediaelement.downloadprogress);
...