Микширование видеопотока и аудио

Artem

New Member
Добрый день!

У нас задача объединить два webrtc стрима.
На входе у нас есть видео+аудио от одного спикера и аудио от другого.
На выходе хотим получить два видео, одно с оригинальным звуком, второе тоже с оригинальным звуком, плюс звук от второго (в таком случае оригинальная звуковая дорожка должна приглушаться).

Как лучше всего решить эту задачу? Через транскодинг?
 
Last edited:

Max

Administrator
Staff member
Добрый день.
Для этой задачи подойдет микшер с включенной поддержкой MCU. Нужно включить MCU для аудио
Code:
mixer_mcu_audio=true
Затем нужно в микшер mixer завести оба потока: speaker1 и speaker2, и забирать выходной поток mixer-stream1, в котором будут видео от speaker1 и аудио от speaker2, и поток mixer-stream2 (видео и аудио от speaker1).
 

Artem

New Member
Спасибо. Еще вопрос немного не по теме.

Как принудительно включать транскодирование чтобы понижать всем входящим потокам fps и как это правильно настроить? Подняли узел transcoder, настроили на нем профили, но потоки с edge серверов все равно идут напрямую, с оригинальным fps.
 

vasyap

New Member
Даже уже прописали на edge серверах cdn_point_of_entry = transcoder, сделали на транскодере профиль, точно совпадающий с запрашиваемым зрителем - все равно edge получает поток напрямую от origin, минуя транскодер вообще.

Есть предположение, что понижение fps может помочь увеличить "вместимость" одной ноды.
 

Max

Administrator
Staff member
Как принудительно включать транскодирование
Настройкой
Code:
disable_streaming_proxy =true
Но лучше не включать. CDN транскодинг нода не предназначена для принудительного включения транскодинга.
Подняли узел transcoder, настроили на нем профили
Профили настраиваются на Edge-севрере.
Для настройки транскодинга на Edge сервере используются профили. Файл профилей транскодинга cdn_profiles.yml должен располагаться в каталоге /usr/local/FlashphonerWebCallServer/conf на Edge сервере
Подняли узел transcoder, настроили на нем профили, но потоки с edge серверов все равно идут напрямую, с оригинальным fps.
Убедитесь, что профили прописаны на Edge сервере.
Даже уже прописали на edge серверах cdn_point_of_entry = transcoder
Это не поможет. Неважно, какая точка входа.
сделали на транскодере профиль, точно совпадающий с запрашиваемым зрителем
Профиль конфигурируется на Edge.
все равно edge получает поток напрямую от origin, минуя транскодер вообще
Убедиться что на транскодере выполняется транскодинг можно из статистики:
curl http://localhost:8081?action=stat
в статистике должны быть
Code:
native_resources=...H264...
Статистика открытых декодеров и энкодеров
Есть предположение, что понижение fps может помочь увеличить "вместимость" одной ноды.
Вместимость Edge-сервера, который будет раздавать транскодированный в 30 FPS поток - да, увеличит.
Вместимость Transcoder-севрера уменьшит. Задача FPS фильтра - выравнивать FPS вверх, например до 30 FPS чтобы выдавать стабильный FPS на HLS, который требователен к постоянному FPS/GOP. Уменьшение FPS скорее всего не будет работать. Только наращивание.
 
Last edited:

Max

Administrator
Staff member
FPS можно понизить на стороне front-end.
В примере Media Devices, FPS задается в поле FPS.
 

vasyap

New Member
Вместимость Edge-сервера, который будет раздавать транскодированный в 30 FPS поток - да, увеличит.
Вместимость Transcoder-севрера уменьшит.
Задача FPS фильтра - выравнивать FPS вверх, например до 30 FPS чтобы выдавать стабильный FPS на HLS, который требователен к постоянному FPS/GOP. Уменьшение FPS скорее всего не будет работать. Только наращивание.
Чтобы убедиться, что правильно Вас понял - сейчас есть ощущение, что мы упираемся в канал в облаке, потому что никакое увеличение ресурсов (CPU/RAM) не способствует возможности раздавать плавно больше, чем 500 одновременно подключенным клиентам. Есть предположение, что снижение количества кадров в секунду (с 30 до, наоборот, 24, а то и 20 или даже 15) может серьезно повлиять на это число в сторону увеличения, чего я и добиваюсь. Транскодеру мы можем выделить любые мощности для нужд исключительно преобразования входящего потока в 30 (если не 60) fps в пролетарские 24 или 20.
 

vasyap

New Member
FPS можно понизить на стороне front-end.
В примере Media Devices, FPS задается в поле FPS.
Но я не смогу проверить свое предположение нагрузочным тестом из Console, увы.
 

vasyap

New Member
Прописал на Edge (и транскодере) серверах такой профиль
Code:
 -webrtc-240:
  audio:
    codec : opus
    rate : 48000
  video:
    width : 320
    height : 240
    codec : h264
    codecImpl : FF
    gop : 50
    fps : 20
Трафик все равно идет напрямую. Можете дать точную инструкцию, как завернуть все входящие потоки на принудительное сокращение fps? А то я/мы запутался.
 

Max

Administrator
Staff member
Трафик все равно идет напрямую.
Как запрашивается поток подписчиком на Edge - по имени <streamName>-webrtc-240?
 

Artem

New Member
Добрый день.
Для этой задачи подойдет микшер с включенной поддержкой MCU. Нужно включить MCU для аудио
Code:
mixer_mcu_audio=true
Затем нужно в микшер mixer завести оба потока: speaker1 и speaker2, и забирать выходной поток mixer-stream1, в котором будут видео от speaker1 и аудио от speaker2, и поток mixer-stream2 (видео и аудио от speaker1).
Исходя из таблички в доках в таком случае у нас будет только аудио.
А при mixer_mcu_video=true микшер mixer-stream1 будет пытаться забрать видео у speaker2, а нам нужно от первого.
 

Artem

New Member
И еще вопрос, применимо ли микширование к roomApi? Есть примеры?
 

Max

Administrator
Staff member
Исходя из таблички в доках в таком случае у нас будет только аудио.
Вы можете на клиенте проиграть одновременно два потока: отдельно видео и отдельно микшированное аудио. Посмотрите, пожалуйста, пример 2 Players
И еще вопрос, применимо ли микширование к roomApi? Есть примеры?
RoomApi - это обертка над REST hook /OnDataEvent для отслеживания статуса пользователя (вошел-вышел) и организации чата между пользователями. Потоки при этом публикуются обычным образом, их также можно микшировать.
Есть также пример конференции с использованием MCU микшера, для видеоконференций с большим числом участников. Посмотреть пример в действии можно на демо сервере.
 

Artem

New Member
А можно ли произвольно микшировать аудио и видео?
Грубо говоря в этой табличке расставить плюсы и минусы каким-то другим образом?
tabl.png
 

Max

Administrator
Staff member
А можно ли произвольно микшировать аудио и видео?
В рамках MCU - нет, этот функционал создавался именно под конференции, чтобы каждый участник мог слышать/видеть всех, кроме самого себя (иначе будет эхо)
Вы можете публиковать отдельно видео и аудио потоки и микшировать их, как необходимо. Единственное ограничение: один поток не может быть добавлен в два и более микшера, хотя выходной поток одного микшера может быть добавлен в другой микшер.
 

Max

Administrator
Staff member
Добрый день.
Зравствуйте, а возможно ли реализовать свой класс обработки аудио на подобие класса обработки видео IVideoMixerLayout ?
В этом классе меняется только размещение картинок в микшере, сами кадры при этом никак не изменяются. Для обработки декодированных кадров необходимо реализовать другой класс.
Отметим, что, в отличие от попиксельного изменения кадров, изменение аудиосоставляющей может привести к потере синхронизации между аудио и видео в потоке, поэтому возможность вносить изменения в декодированное аудио не предусмотрена.
Пожалуйста, уточните, какие именно задачи не могут быть решены микшированием аудио потоков, которое обсуждается в этой теме выше?
 

dmitry1987

New Member
Добрый день.

В этом классе меняется только размещение картинок в микшере, сами кадры при этом никак не изменяются. Для обработки декодированных кадров необходимо реализовать другой класс.
Отметим, что, в отличие от попиксельного изменения кадров, изменение аудиосоставляющей может привести к потере синхронизации между аудио и видео в потоке, поэтому возможность вносить изменения в декодированное аудио не предусмотрена.
Пожалуйста, уточните, какие именно задачи не могут быть решены микшированием аудио потоков, которое обсуждается в этой теме выше?
Нам необходимо иметь возможность выбирать у кого потока будет включено аудио в микшированный поток, а у кого нет. Т.е. возможность отключить аудио у некоторых потоков, а еще лучше изменить громкость аудио определенного входящего стрима в выходном потоке
 

Max

Administrator
Staff member
Нам необходимо иметь возможность выбирать у кого потока будет включено аудио в микшированный поток, а у кого нет. Т.е. возможность отключить аудио у некоторых потоков, а еще лучше изменить громкость аудио определенного входящего стрима в выходном потоке
Начиная со сборки 5.2.689, можно добавить только видео из потока в аудио+видео микшер по REST API, например
Code:
/rest-api/mixer/add
{
 "uri": "mixer://mixer1",
 "remoteStreamName": "stream1",
 "hasAudio": "false"
}
 
Top