#c# #silverlight #stream #mediaelement
#c# #silverlight #поток #mediaelement
Вопрос:
Я пытаюсь выяснить, возможно ли воспроизвести видео в MediaElement из потока, который все еще загружается, вместо того, чтобы ждать его завершения? Я довольно тщательно изучил тему, но не нашел окончательного ответа.
Я пытаюсь реализовать воспроизведение по запросу. В настоящее время я проигрываю видео, присваивая uri источнику MediaElement, и это работает. Я хочу изменить это для воспроизведения, открыв uri в потоке и назначив поток MediaElement с помощью setSource.
Я написал код, который принимает uri, создает WebClient и использует OpenReadAsync, чтобы начать чтение из него. Я установил для параметра AllowReadStreamBuffering значение false, чтобы позволить мне получать поток из OpenReadComplete, как только он станет доступен (вместо того, чтобы ждать его завершения загрузки). Как только у меня появляется дескриптор потока, я присваиваю его MediaElement и пытаюсь воспроизвести.
В настоящее время это приводит к сбою в системе.Исключение: ошибка 2210. Поскольку я знаю, что ресурс существует и доступен для чтения, я не знаю, является ли неправильным мой код, или просто невозможно, чтобы MediaElement воспроизводил из потока, который является неполным.
Если это невозможно с помощью setSource и потока, возможно ли это с помощью setSource и класса MediaStreamSource? Я посмотрел MediaStreamSource для этой задачи, но, похоже, это потребовало от меня написания кода, который анализировал входящий поток и извлекал из него фрейм за раз, что звучало болезненно.
Комментарии:
1. Это возможно, в настоящее время я делаю это в нескольких приложениях. Если кто-то все еще ищет «практическое руководство», я мог бы написать более подробный ответ.
2. @jv42: Привет, я пытаюсь воспроизвести все еще загружаемый поток в silverlight, но пока безуспешно. Я попытался расширить MemoryStream и заблокировать доступ к методам read и wite (чтобы позволить MediaElement впоследствии считывать загруженные байты и записывать данные [постоянно полученные из сокета] всегда в конце потока). Поток воспроизводится, но только до того момента времени, который уже был загружен при запуске воспроизведения. Не могли бы вы, пожалуйста, поделиться со мной решением, о котором вы упомянули?
3. Ах, в таком случае… ну, лучшее, что мне удалось, это определить конец потока и перезапустить воспроизведение с последней позиции. Это вызывает небольшую заминку, но обеспечивает непрерывное воспроизведение.
4. @ jv42 был бы очень заинтересован в более подробном ответе о том, как вы решили это
5. @SamiRajala Как я уже говорил выше, лучшее, что я получил, это воспроизведение до того места, где оно было загружено при начале воспроизведения, не настолько хорошее.