Нет изображения на некоторых стримах

Maksym

Member
Добрый день.
Очень странная ситуация.
Написали свое приложение для стрима и просмотра стримов.
С большинством все ОК, но проскакивает иногда стрим без видео, только аудио. Причем что если зайти на сервер, на который публикуется стрим, то через плеер нет даже звука. Обычная пустота и спинер крутится.
Версия старая FlashphonerWebCallServer-5.0.3100, но это продакшин и обновлять пока не можем
Логи высылаю как всегда на logs@flashphoner.com с указанием поста
 

Max

Administrator
Staff member
Добрый день.
В логах проскакивают ошибки, которые могут повлиять на видео.
Code:
07:48:26,441 WARN                     F - RTP-pool-112-thread-19393 Packet is not authenticate
Можно попробовать обновить до последней версии по ветке 5.0.
https://flashphoner.com/download-wcs5-server.tar.gz
Сборка 3406 должна быть безопасной в плане обновления.
Если будут проблемы, всегда можно откатить на предыдущую.
Code:
service webcallserver update 3100
Если проблема повторится, опредилите имя стрима и время когда это случилось.
Тогда в логах можно будет найти и протрейсить конкретный поток и сессию.
Лог стримов пишется в файл logs/CDR/sdr.log
https://docs.flashphoner.com/display/WCS5RU/WCS+Core#WCSCore-SDR-логи
 

Maksym

Member
ОК. Попробуем обновится. Просто при обновлении затираются конфиги и скрипты, потому надо будет все быстро сделать через тот же ансибл. Помимо этого у нас еще идет авторизация через resrt, а база тоже требся при обновлении.
Спасибо. Будем пробовать.
Скажите, логов хватило или надо было еще какие-то. Если да - то скину скрипт, для поиска нужных файлов(для упрощения жизни другим), а то у нас их уже порядка 4 гиг на каждом сервере

Update:
1.Только что глянул. Такая ошибка только по одному стриму есть, а я вам скидывал логи по двум стримам. Причем первый стрм, тот что раньше - на сервере Франкфурта, а последний, через сутки на сервере в Сингапуре, то есть все же взаимосвязи по ошибки нету, хотя ее отбрасывать я не буду

2.Отдельная благодарность за приведение документации в доступный вид. А то прошлые были на троечку
3. Имя стримов указано в имени архива(начинается с дефиса)
 
Last edited:

Maksym

Member
Обновились до 3471, стримы все равно иногда не работают
вот кусок лога flashphoner_manager.log в момент подключения к стриму, который не видно. Утром буду детально изучать /тестировать
Code:
ERROR agerRemoteRmiService - RMI TCP Connection(2543)-ххх.ххх.ххх.ххх Got exception in REST
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of com.flashphoner.server.commons.rmi.data.impl.Stream out of START_ARRAY token
at [Source: org.apache.http.conn.EofSensorInputStream@7124811e; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.flashphoner.server.commons.rmi.data.impl.Stream out of START_ARRAY token
at [Source: org.apache.http.conn.EofSensorInputStream@7124811e; line: 1, column: 1]
        at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228)
        at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:220)
        at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:553)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:506)
        at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:334)
        at com.flashphoner.server.manager.rmi.operations.impl.ManagerRemoteRmiService.postForObject(ManagerRemoteRmiService.java:115)
        at com.flashphoner.server.manager.rmi.operations.impl.ManagerRemoteRmiService.StreamStatusEvent(ManagerRemoteRmiService.java:295)
        at sun.reflect.GeneratedMethodAccessor186.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
        at sun.rmi.transport.Transport$1.run(Transport.java:200)
        at sun.rmi.transport.Transport$1.run(Transport.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$95(TCPTransport.java:683)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.flashphoner.server.commons.rmi.data.impl.Stream out of START_ARRAY token
at [Source: org.apache.http.conn.EofSensorInputStream@7124811e; line: 1, column: 1]
        at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
        at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:691)
        at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:685)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromArray(BeanDeserializerBase.java:1215)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:151)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)
        at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:225)
        ... 23 more
 
Last edited:

Max

Administrator
Staff member
Добрый день.
Это ошибка десериализации JSON при получении объекта Stream.
https://stackoverflow.com/questions/19333106/jsonmappingexception-out-of-start-array-token
Например:
1. Пользователь делает stream.play()
2. WCS отправляет REST запрос playStream
3. Бэкенд отвечает 200 OK с некорректным JSON.
4. WCS запрещает играть этот стрим, т.к. произошла ошибка распаковки JSON.
Самый простой способ протрейсить, это перевести REST на http протокол если он сейчас на https и снять дамп http трафика
Code:
tcpdump port 80 -s 4096 -w log.pcap
И в этом дампе найти проблемный HTTP response.
Либо протрейсить на стороне бэкенда, который возвращает ответ.
 

Maksym

Member
Запарился немного. В общем,с парсингом ответа от реста действительно была трабла - рест присылал массив. Но проблема с воспроизведением видео не в этом(скорее всего), так как проблема с парсингом от реста (/StreamStatusEvent) для всех была, а проблема с воспроизведением видео 1 на 150. причем, что с одного и того же девайса, люди стримят и иногда не можем зайти на их стримы.
Не могу остановить пока серваки, а на стейдже проблема не воспроизводится. Отпишусь по появлению инфо
 

Maksym

Member
Отправил новую пачку логов. Там по временной метки в логах все началось в 12:16
 

Maksym

Member
Есть какие-то результаты? А то мягко говоря - не хорошо нам
 

Maksym

Member
В добавку, заметил что на стримах, где не воспроизводится видео не приходят
notifyVideoFormat

Upd.:

Как мне принудительно отправлять вотчеру notifyVideoFormat, если это возможно?
 
Last edited:

Max

Administrator
Staff member
Добрый день.

Логи проверили. Каких-либо ошибок, которые бы влияли на потоки, в логах нет.
1. Воспроизводится ли проблема если забирать стрим напрямую с Origin?
2. Есть ли доступ к браузеру, публикующему поток? Возможность воспроизвести проблему искуственно?

В добавку, заметил что на стримах, где не воспроизводится видео не приходят notifyVideoFormat
это похоже на случай, когда браузер не отправляет ключевой фрейм по запросу
варианты исправления:

1. Добавить настройки на Origin.
Code:
periodic_fir_request=true
periodic_fir_request_interval=5000
эти настройки включают запрос K-фрейма у браузера каждые 5 секунд.

2. Отключить передачу FIR запросов от Edge серверов через Origin.
Т.е. только Origin будет запрашивать K-фреймы у паблишеров. Edge запрашивать не будет.
Code:
proxy_propagate_fir=false
Еще есть вариант что это проблема захвата камеры или H.264 encoder-а на стороне публикующего браузера.
В этом случае можно попробовать уточнить что за браузер или ОС и использовать для таких браузеров VP8 кодек или специальные настройки камеры, если со стандартными не работает.
 

Maksym

Member
1. Воспроизводится ли проблема если забирать стрим напрямую с Origin?
Да, но только через админку WCS. Еще не делали билд, который бы напрямую конектился к ориджину
2. Есть ли доступ к браузеру, публикующему поток? Возможность воспроизвести проблему искуственно?
Нет, нету :(.
На стейдж серверах проблема не воспроизводится. Но и на проде с одного и того же девайса, проблема бывает, но как-то рандомно. То-есть стример стримит и может быть все ок. После пересоздает стрим(минут через 5) и уже на стриме нет видео(только звук). Дальше может три раза создавать новые стримы(конечно же завершая старые) и проблема не воспроизводится(есть и аудио и видео), потом на следующий день из 30 стримов может только один или пять с таким же "боком" появится
2. Есть ли доступ к браузеру, публикующему поток? Возможность воспроизвести проблему искуственно?
Добрый день.
1. Добавить настройки на Origin.
Code:
periodic_fir_request=true
periodic_fir_request_interval=5000
эти настройки включают запрос K-фрейма у браузера каждые 5 секунд.

2. Отключить передачу FIR запросов от Edge серверов через Origin.
Т.е. только Origin будет запрашивать K-фреймы у паблишеров. Edge запрашивать не будет.
Code:
proxy_propagate_fir=false
Какой вариант протестировать первым или лучше оба и сразу?
 

Max

Administrator
Staff member
Какой вариант протестировать первым или лучше оба и сразу?
Эту настройку proxy_propagate_fir=false можно добавлять только при включенных периодических запросах periodic_fir_request=true, иначе связка Origin-Edge работать не будет.
 

Maksym

Member
Заметил одну вещь, но уже утром отпишусь, когда более детально протестирую. Заключается в том, что на эдже по ресту (/rest-api/stream/find_all) есть стримы со статусом PUBLISHING, хотя туда мы не публикуем стримы. Пока только догадка, что это нужно для того, что бы вотчер мог забирать его. Но с этим уже утром буду разбираться, так как сейчас могу что-то и напутать
 

Max

Administrator
Staff member
Это нормальное поведение.
Все стримы, которые Edge забирает с Origin, на Edge - сервере имеют статус PUBLISHING.
 

Maksym

Member
Тогда думаю я понимаю почему нет изображения. По ресту получил данные с ориджина. Стрим со статусом Playing имел высоту и ширину изображения - ноль и на него не мог зайти, а вот другие сримы, на которые можно было зайти, имели высоту и ширину адекватную.
Прислать ответ запроса?
 

Max

Administrator
Staff member
Добрый день. Файлы проверили.

Да, если сделать простой тест Publish / Play на одном сервере, то в /rest/find_all будет видно что есть два стрима 1) PUBLISHING 320x240 2) PLAYING 320x240
Если вы видите нулевое разрешение, то это похоже на проблему. Причем нулевое разрешение - это не причина а следствие. Поток заходит так, что не удается из него извлечь разрешение картинки, которая по нему проходит.

Чего не удалось понять из ваших материалов: воспроизводится ли проблема без Edge серверов?
Т.е. просто играем с Origin, картинки нет. Нужно понять - это проблема внутри CDN или на одном конкретном сервере.
 

Maksym

Member
Чего не удалось понять из ваших материалов: воспроизводится ли проблема без Edge серверов?
Т.е. просто играем с Origin, картинки нет. Нужно понять - это проблема внутри CDN или на одном конкретном сервере.
Боюсь, что не совсем Вас понял.
Ответ от рест прислал с ориджина.
workflow такой:
1) 3 - ориджина и 3- эджа.
2) Один стрим был не рабочий(наше приложение берет стрим с эджа). Узнал его streamID(name)
3) Зашел на рест ориджина и сделал два запроса - один без воспроизведения со сторонней админки (WCS), второй с и отправил вам на почу.
В первом случае со статусом play это как раз наше приложение берет поток через эдж, во втором случае это наше приложение берет стрим через эдж и админка другого wcs напрямую конектится к ориджину и пытается проиграть.

Как я пологаю, трабл уже на этапе воспроизведения с ориджина
 

Max

Administrator
Staff member
Нужны дополнительные логи с Origin-сервера.
Нужно включить:
client_log_level=debug в конфиге flashphoner.properties
В результате будут записаны подробные логи для каждого подключения.
В папке logs/client_logs/{date}/{login}-{date-time}
Т.е. для каждого клиента, который подключился к серверу через Websocket, будет создана отдельная папка и в эту папку будут записаны подробные логи, описывающие стрим.
Эти логи могут занимать много места.
Включите пожалуйста их. И если проблема снова воспроизвелась, нам нужно будет найти лог данного конкретного пользователя и по логу посмотреть как заходил и депакетизировался его стрим.
 

Maksym

Member
ОК. Постараюсь как можно быстрее это сделать. Но это прод и не всегда можно его выклчить на 3 минуты.
 
Top