Динамическое изменение watermarking

fitsar

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

Появилась потребность динамически добавлять текст в поток (или динамически менять водяной знак).
Мы используем chatApp для организации видеочата между двумя собеседниками с последующим объединением двух потоков в один с помощью микшера.
Нужно добавить надпись и иметь возможность ее менянь, подскажите или есть такая возможность ? Если нет, то как можно динамически менять водяной знак?
 

Max

Administrator
Staff member
Добрый день.
Добавить водяной знак в поток можно на стороне сервера двумя способами:
1. Создать транскодер для потока при помощи REST API /transcoder/startup, и добавить картинку в поток
Code:
POST /rest-api/transcoder/startup HTTP/1.1
HOST: wcs:8081
content-type: application/json

{
"uri": "transcoder://tcode1",
"remoteStreamName": "test",
"localStreamName": "testT",
"encoder": {
"width": 640,
"height": 480,
"keyFrameInterval": 30,
"fps": 30,
"watermark": "/opt/media/Test.png"
}
}
Картинки для добавления водяных знаков необходимо поместить в каталог на сервере, например /opt/media/. Поддерживается формат PNG.
2. Использовать собственный класс для перехвата и обработки декодированных фреймов. В этом случае необходимо реализовать Java класс который будет вызван для каждого декодированного фрейма. Вы получаете на вход фрейм в YUV формате, и можете изменять его попиксельно, в том числе отрисовывая текст или картинку. Чтобы этот способ работал, необходимо включить транскодинг для конкретного потока (например, заказывая воспроизведение с заданной шириной и высотой картинки) или для всех потоков на сервере при помощи настройки
Code:
disable_streaming_proxy=true
В обоих случаях, на сервере необходим транскодинг потоков, чтобы декодировать картинки, изменять их и кодировать обратно, поэтому нагрузка на процессор возрастет. Как правило, одно ядро CPU требуется, чтобы закодировать два 720p потока. Для кодирования одного 1080p потока, потребуется уже два ядра.
Также текст или картинку можно добавить на стороне клиента. Для этого поток в браузере нужно захватывать не непосредственно с камеры, а с канваса (см также статью). В последних сборках Web SDK добавлен пример с применением фильтров к изображению Stream Filter (исходный код на GitHub), аналогичным образом можно рисовать в кадре текст или картинку. В этом случае кодирование и декодирование производится на стороне клиента, что позволяет разгрузить сервер.
 

fitsar

New Member
Если использовать свой Java класс, можно узнать время стрима или время его начала в этом классе? Нудно в зависимости от времени менять надпись.
Эта надпись будет на все стримах или на одном?
 

Max

Administrator
Staff member
Если использовать свой Java класс, можно узнать время стрима или время его начала в этом классе? Нудно в зависимости от времени менять надпись.
Эта надпись будет на все стримах или на одном?
Java классу доступно только имя стрима и фреймы из него в YUV формате. То есть надпись можно рисовать на каждый стрим.
Но данный способ, видимо, будет сложным в Вашем случае. Поэтому рекомендуем взять за основу пример Stream Filter (доступен начиная со сборки WebSDK 0.5.28.2753.155) и рисовать надпись на стороне клиента. В этом случае текущее время от начала стрима будет известно, а реализация будет проще, чем на стороне сервера, и дешевле с точки зрения серверных ресурсов.
 
Top