22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
1
.NET 4.x

Компонент AxWindowsMediaPlayer, создание стабильной онлайн трансляции

11.01.2016, 12:42. Показов 744. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Пишу программу, которая должна воспроизводить онлайн-трансляцию, но БЕЗ СБОЕВ - это критично!!!

Попался под руку компонент axwindowsmediaplayer - это обычный виндовый плеер. Он умеет воспроизводить онлайн-поток. Но мне важно, чтобы в случае сбоя, программа автоматически сама обнаружила этот сбой и переподключилась к трансляции.

Перезапускаю плеер таким вот образом ну и считаю, что это правильно. Если кто-то посоветует метод лучше - приму к рассмотрению и буду сильно благодарен:
VB.NET
1
2
3
4
    Private Sub PlayerRestart()
        wmp_Player.close()
        wmp_Player.Ctlcontrols.play()
    End Sub
Теперь главное - отловы сбоев. Здесь у меня все очень костыльно, использую таймеры иначе если выполнять все нужные действия сразу и без ожидания, то плеер виснет нахрен. Первый отлов:

VB.NET
1
2
3
Private Sub wmp_Player_MediaError(sender As Object, e As AxWMPLib._WMPOCXEvents_MediaErrorEvent) Handles wmp_Player.MediaError
        tmr_Restart.Enabled = True
    End Sub
То есть, получил ошибку - включил таймер, таймер подождал 1 секунду (пока плеер "отойдет" от ошибки) и отдаем команду на перезапуск трансляции:
VB.NET
1
2
3
4
Private Sub tmr_Restart_Tick(sender As Object, e As EventArgs) Handles tmr_Restart.Tick
        PlayerRestart()
        tmr_Restart.Enabled = False
    End Sub
Случается и так, что аудиопоток может магическим образом закрыться. Это не вызовет ошибку, плеер просто закончит воспроизведение и остановится. Но мы с вами прекрасно знаем что закрытие аудиопотока на самом деле ошибочное и поток не закрылся на самом деле - это очередной сбой, поэтому нужно перезапускать!
Чисто в теории, можно было бы отловить событие остановки по:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Private Sub wmp_Player_PlayStateChange(sender As Object, e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles wmp_Player.PlayStateChange
        Select Case e.newState
            Case 0 ' Undefined
                lbl_State.Text = "Неопределенность"
            Case 1 ' Stopped
                lbl_State.Text = "Остановлено"
            Case 2 ' Paused
                lbl_State.Text = "Приостановлено"
            Case 3 ' Playing
                lbl_State.Text = "Воспроизводится"
            Case 4 ' ScanForward
 
            Case 5 ' ScanReverse
 
            Case 6 ' Buffering
                lbl_State.Text = "Буферизация..."
            Case 7 ' Waiting
                lbl_State.Text = "Ожидание..."
            Case 8 ' MediaEnded
                lbl_State.Text = "Окончено"
            Case 9 ' Transitioning
                lbl_State.Text = "Переход..."
            Case 10 ' Ready
                lbl_State.Text = "НЕ ИГРАЕТ!!!"
            Case 11 ' Reconnecting
                lbl_State.Text = "Переподключение..."
            Case 12 ' Last
                lbl_State.Text = "Последний!"
            Case Else
                lbl_State.Text = ("Неизвестное состояние: " + e.newState.ToString())
        End Select
    End Sub
Но я не захотел париться с оттачиванием и реализацией этого метода по-нормальному, так как времени на это совершенно нету. Поэтому поступил проще - еще один таймер. Таймер каждые 500 мс (полсекунды) проверяет, находится ли плеер в состоянии воспроизведение, если да, то норм, если нет - перезапускаем:
VB.NET
1
2
3
4
5
6
7
Private Sub tmr_Control_Tick(sender As Object, e As EventArgs) Handles tmr_Control.Tick
        If (wmp_Player.playState = WMPLib.WMPPlayState.wmppsPlaying) Then
           'норм
        Else
           'перезапускаем
        End If
    End Sub
В чем же проблема? Проблема что иногда программа входит в какое-то непредусмотренное состояние и плеер воспроизводит и ошибки нет, а звука нет. Только когда производишь перезапуск вручную, начинает играть:

VB.NET
1
2
3
4
Private Sub PlayerRestart()
        wmp_Player.close()
        wmp_Player.Ctlcontrols.play()
    End Sub
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2016, 12:42
Ответы с готовыми решениями:

Создание онлайн трансляции
Есть ли в C# средства, с помощью которых можно создать приложение с проигрывателем видео в режиме...

Онлайн трансляции
Хочу сделать сайт, на котором будут онлайн трансляции. То есть буду просто брать коды вставки с...

онлайн-трансляции
Всем привет. Кто знает на каком сайте сегодня будет онлайн трансляция матча Арсенал-Наполи? 22-45...

Как убрать кнопку онлайн трансляции
Всем добрый день, есть сайт: http://www.afina-service.ru/. Подскажите как убрать слева внизу кнопку...

0
11.01.2016, 12:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.01.2016, 12:42
Помогаю со студенческими работами здесь

Как записывать онлайн трансляции футбола
Добрый день, ув. форумчане, недавно всерьез задумался о создании своего футбольного youtube канала,...

Организация онлайн-трансляции мероприятия на сайте joomla 2.5.8
Здравствуйте, уважаемые форумчане!:) Подскажите, пожалуйста, как можно реализовать...

Кроссплатформенный видео-плеер для онлайн-трансляции
Всем доброго дня. Не знал в каком разделе разместить тему поэтому разместил в первом) Вобщем, мне...

Создание потоковой трансляции на сайте
Доброго дня всем! Возникло желание пускать на сайте потоковое видео. достал для этого дела flash...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru