Как сделать публикацию стрима под android только с Audio?

R2D2

Member
Привет как сделать публикацию стрима под Android только с включаемыми/выключаемыми видеоданными (чтоб была возможность передавать только звук)? Причем чтоб можно было Видео включать/выключать на передающей стороне в опубликованном стриме.

1. Пробывал через .getConstraints().updateVideo(false) - видео данные после публикации не передаются, далее после публикации стрима включить видеоданные методом updateVideo(true) - не получилось
2. После публикации стрима делал muteVideo() на передающей стороне - вроде все хорошо, но пустые видеоданные в стриме присутствуют (наверное это не очень хорошо)

Ну и главный вопрос как на принимающей стороне(android) ловить изменение параметров стрима?
через onStreamStatus не удается т.к там и таких событий нет...
 

Max

Administrator
Staff member
Добрый день
1. Пробывал через .getConstraints().updateVideo(false) - видео данные после публикации не передаются, далее после публикации стрима включить видеоданные методом updateVideo(true) - не получилось
Так действительно не получится. Вы удалили видео дорожку из потока, чтобы ее добавить, нужен повторный обмен SDP между клиентом и сервером. Это пока не реализовано на стороне сервера, хотя есть в планах. Однако, мы не можем пока назвать сроки реализации, тем более на стороне Android SDK.
2. После публикации стрима делал muteVideo() на передающей стороне - вроде все хорошо, но пустые видеоданные в стриме присутствуют (наверное это не очень хорошо)
Это нормальное поведение. Библиотека WebRTC в случае, когда видео заглушено, отправляет черный экран. Так же делают и все браузеры.
Ну и главный вопрос как на принимающей стороне(android) ловить изменение параметров стрима?
через onStreamStatus не удается т.к там и таких событий нет...
О том, что видео на стороне публикации заглушено, принимающая сторона может узнать только по сниженному битрейту видео (менее 5000 бит/с). Определить битрейт публикации потока можно по REST API /stream/metrics, параметр VIDEO_RATE.
 

R2D2

Member
Добрый день
О том, что видео на стороне публикации заглушено, принимающая сторона может узнать только по сниженному битрейту видео (менее 5000 бит/с). Определить битрейт публикации потока можно по REST API /stream/metrics, параметр VIDEO_RATE.
Предложенный метод - требует постоянного сканирования, что очень плохо (требует создания отдельного потока, постостоянный анализ и т/д) - нельзя ли как то автоматически, по событию????
 

Max

Administrator
Staff member
Предложенный метод - требует постоянного сканирования, что очень плохо (требует создания отдельного потока, постостоянный анализ и т/д) - нельзя ли как то автоматически, по событию????
Можно вынести сканирование на бэкенд. Тогда бэкенд:
1. Собирает данные о подключенных сессиях, обрабатывая REST hook /connect и получая sessionId
2. Собирает данные о публикациях и подписчиках, обрабатывая /publishStream и /playStream
3. Мониторит метрику VIDEO_RATE для опубликованных потоков
4. Если битрейт потока упал ниже 5000 бит/c, отправляет всем подписчикам этого потока сообщение по REST API /data/send
Code:
POST /rest-api/data/send HTTP/1.1
Host: wcs:8081
Content-Type: application/json

{
    "nodeId":"",
    "operationId":"",
    "sessionId":"/192.168.1.102:15422/192.168.1.101:8443",
    "payload":{
        "stream": {
               "status":"muted"
        }
    }
}
Чтобы обработать сообщение, в приложении на клиенте нужно переопределить SessionEvent.onAppData, например:
Code:
                    session.on(new SessionEvent() {
                        @Override
                        public void onAppData(Data data) {
                              CustomObject payload = new CustomObject((Map<String, Object>)data.getPayload());
                              String status = payload.getCustomAsString("status", null);
                              if (status.equals("muted")) {
                                     mStatusView.setText("MUTED");
                              }
                        }
                   ...
                   });
 

R2D2

Member
Решил пойти пути: Пересоздаю новый стрим. до создания стрима устанавливаю streamOptions.getConstraints().updateVideo(false) - видео данные после публикации не передаются.
На принимающей стороне - видно что, действительно видео данных нет. Но приложению надо понять как то из стрима что видеоданных нет. Я считал что признак в стриме stream.isHasVideo() будет равным false - однако, я вижу что это не так! (почему то isHasVideo()=true)!
Почему?
Как понять что в стриме нет видео, по какому признаку?
 
Last edited:

Max

Administrator
Staff member
(почему то isHasVideo()=true)!
Скорее всего, WebRTC библиотека (которая используется под капотом Android SDK) в SDP для сервера все таки показывает видео дорожку в этом случае, хоть и не отправляет медиа данные.
Как понять что в стриме нет видео, по какому признаку?
По битрейту видео: если в потоке нет видео, значение метрики VIDEO_RATE будет равно 0.
Кроме того, понадобится отключить контроль активности RTP трафика на стороне сервера
Code:
rtp_activity_video=false
иначе публикация такого потока будет завершаться сервером по неактивности с диагнозом Failed by video RTP activity
 

Max

Administrator
Staff member
Добрый день.
В сборке Android SDK 1.1.0.20 добавлена возможность получения от сервера сообщений с текущим битрейтом публикации и проигрывания и контроля качества канала, основываясь на разнице битрейтов клиента и сервера. Подробности читайте здесь
 
Top