Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Поддерживаемые кодеки

Видео:

  • H264
  • VP8
  • H265 (начиная со сборки 5.2.1803)

Аудио:

  • Opus
  • AAC
  • G711 (PCMA, PCMU)
  • G722

В каких случаях включается транскодинг

...

REST-метод

Пример тела REST-запроса

Пример тела REST-ответа

Статусы ответа

Описание

/transcoder/startup

Code Block
languagejs
themeRDark
{
 "uri": "transcoder://tcode1",
 "remoteStreamName": "test",
 "localStreamName": "testT",
 "encoder": {
  "width": 640,
  "height": 480,
  "keyFrameInterval": 30,
  "fps": 30,
  "watermark": "Test.png"
 }
}

400 - Bad request

409 - Conflict

500 - Internal error


Создать транскодер с указанными параметрами для заданного потока


/transcoder/find
Code Block
languagejs
themeRDark
{
 "remoteStreamName": "test"
}
Code Block
languagejs
themeRDark
[
    {
        "localMediaSessionId": "42a92132-bcd1-4436-a96f-3fec36b32b37",
        "localStreamName": "testT",
        "remoteStreamName": "test",
        "uri": "transcoder://tcode1",
        "status": "PROCESSED_LOCAL",
        "hasAudio": true,
        "hasVideo": true,
        "record": false,
        "encoder": {
            "width": 640,
            "height": 480,
            "keyFrameInterval": 30,
            "fps": 30,
            "watermark": "Test.png"
        }
    }
]

200 – транскодеры найденыOK

404 – транскодеры не найденыNot found

Найти транскодер по указанным критериям

/transcoder/find_all


Code Block
languagejs
themeRDark
[
    {
        "localMediaSessionId": "42a92132-bcd1-4436-a96f-3fec36b32b37",
        "localStreamName": "testT",
        "remoteStreamName": "test",
        "uri": "transcoder://tcode1",
        "status": "PROCESSED_LOCAL",
        "hasAudio": true,
        "hasVideo": true,
        "record": false,
        "encoder": {
            "width": 640,
            "height": 480,
            "keyFrameInterval": 30,
            "fps": 30
        }
    }
]

200 – транскодеры найденыOK

404 – транскодеры не найденыNot found

Найти все транскодеры

/transcoder/terminate

Code Block
languagejs
themeRDark
{
"uri":"transcoder://tcode1"
}

200 - транскодер завершенOK

404 - транскодер не найденNot found

Остановить транскодер и его выходной поток

Параметры

Имя параметра

Описание

Пример

uri

URL транскодера

transcoder://tcode1
localStreamNameИмя выходного потока транскодера
testT
remoteStreamNameИмя транскодируемого потока
test
localMediaSessionIdИдентификатор медиасессии транскодера
42a92132-bcd1-4436-a96f-3fec36b32b37

status

/transcoder/set_watermark
Code Block
languagejs
themeRDark
{
 "uri":"transcoder://tcode1",
 "watermark":"/opt/media/logo.png",
 "x":10,
 "y":10,
 "marginTop":5,
 "marginLeft":5,
 "marginBottom":5,
 "marginRight":5 
}

200 - OK

400 - Bad request

404 - Not found

Добавить водяной знак к потоку транскодера

Параметры

Имя параметра

Описание

Пример

uri

URL транскодера

transcoder://tcode1
localStreamNameИмя выходного потока транскодера
testT
remoteStreamNameИмя транскодируемого потока
test
localMediaSessionIdИдентификатор медиасессии транскодера
42a92132-bcd1-4436-a96f-3fec36b32b37

status

Текущий статус транскодера

PROCESSED_LOCAL
hasAudioВыходной поток содержит аудио
true
hasVideoВыходной поток содержит видео
true
recordВыходной поток записывается
false
Параметры кодирования
widthШирина картинки
640
heightВысота картинки (обязательный параметр)
480
keyFrameIntervalЧастота генерации ключевых кадров (GOP)
30
fpsЧастота кадров в секунду
30
bitrateБитрейт в кб/с
500
typeКодек
OPENH264
watermarkФайл водяного знакаTest.png

...

REST-методы и статусы ответа

REST-метод

Пример тела REST-запроса

Пример тела REST-ответа

Статусы ответа

Описание

/transcoder2/startup

Code Block
languagejs
themeRDark
{
 "uri": "transcoder2://tcode2",
 "remoteStreamName": "test",
 "localStreamName": "testT",
 "encoder": {
  "videoCodec": "H264",
  "audioCodec": "mpeg4-generic",
  "width": 320,
  "height": 240,
  "keyFrameInterval": 60,
  "fps": 30,
  "audioRate": 44100,
} }

Имя параметра

Описание

Пример

uri

URL транскодера

transcoder2://tcode2
localStreamNameИмя выходного потока транскодера
testT
remoteStreamNameИмя транскодируемого потока
test
localMediaSessionIdИдентификатор медиасессии транскодера
  "audioBitrate": 64000
 }
}

200 - OK

400 - Bad request

409 - Conflict

500 - Internal error


Создать транскодер с указанными параметрами для заданного потока


/transcoder2/find
Code Block
languagejs
themeRDark
{
 "remoteStreamName": "test"
}
Code Block
languagejs
themeRDark
[
  {
    "localMediaSessionId": "82ad5545-e11e-4f0f-801a-49e69d8c38f2",
    "localStreamName": "testT",
    "remoteStreamName": "test",
    "uri": "transcoder2://tcode2",
    "status": "PROCESSED_LOCAL",
    "hasAudio": true,
    "hasVideo": true,
    "record": false,
    "encoder": {
      "width": 320,
      "height": 240,
      "keyFrameInterval": 60,
      "fps": 30,
      "audioRate": 44100,
      "audioCodec": "mpeg4-generic",
      "videoCodec": "H264",
      "videoRate": 90000
    }
  }
]

200 – OK

404 – Not found

Найти транскодер по указанным критериям

/transcoder/find_all


Code Block
languagejs
themeRDark
[
  {
    "localMediaSessionId": "82ad5545-e11e-4f0f-801a-49e69d8c38f2",
    "localStreamName": "testT",
    "remoteStreamName": "test",
    "uri": "transcoder2://tcode2",
    "status": "PROCESSED_LOCAL",
    "hasAudio": true,
    "hasVideo": true,
    "record": false,
    "encoder": {
      "width": 320,
      "height": 240,
      "keyFrameInterval": 60,
      "fps": 30,
      "audioRate": 44100,
      "audioCodec": "mpeg4-generic",
      "videoCodec": "H264",
      "videoRate": 90000
    }
  }
]

200 – OK

404 – Not found

Найти все транскодеры

/transcoder/terminate

Code Block
languagejs
themeRDark
{
 "uri":"transcoder2://tcode2"
}

200 – OK

404 – Not found

Остановить транскодер и его выходной поток

Параметры

/transcoder2/set_watermark
Code Block
languagejs
themeRDark
{
 "uri":"transcoder2://tcode1",
 "watermark":"/opt/media/logo.png",
 "x":10,
 "y":10,
 "marginTop":5,
 "marginLeft":5,
 "marginBottom":5,
 "marginRight":5
}

200 - OK

400 - Bad request

404 - Not found

Добавить водяной знак к потоку транскодера

Параметры

Имя параметра

Описание

Пример

uri

URL транскодера

transcoder2://tcode2
localStreamNameИмя выходного потока транскодера
testT
remoteStreamNameИмя транскодируемого потока
test
localMediaSessionIdИдентификатор медиасессии транскодера
82ad5545-e11e-4f0f-801a-49e69d8c38f2

status

Текущий статус транскодера

PROCESSED_LOCAL
hasAudioВыходной поток содержит аудио
true
hasVideoВыходной поток содержит видео
true
recordВыходной поток записывается
false
Параметры кодирования
widthШирина картинки
320
heightВысота картинки (обязательный параметр)
240
audioCodecКодек аудиоmpeg4-generic
audioRateЧастота дискретизации аудио, Гц 44100
audioChannelsКоличество каналов аудио2
audioBitrateБитрейт аудио, бит/с64000
videoCodecКодек видеоH264
keyFrameIntervalЧастота генерации ключевых кадров (GOP)
30
fpsЧастота кадров в секунду
30
bitrateБитрейт видео в кб/с
500
typeКодировщик
OPENH264
watermarkФайл водяного знакаTest.png
videoRateЧастота дискретизации видео, Гц90000

Ограничения

1. Если параметры транскодирования видео переданы для потока без видео, либо параметры транскодирования аудио переданы для потока без аудио, запрос вернет 400 Bad request

...

По умолчанию, если поток опубликован с одними размерами кадра, а запрашивается для воспроизведения с другими размерами, WCS пытается сохранить соотношение сторон видео. Например, если на сервере опубликован поток разрешением 640x360 и соотношением сторон 16:9, а подписчик запрашивает воспроизведение 320x240 (4:3), поток будет транскодирован к разрешению 320x180 (16:9). Если подписчик запрашивает только высоту картинки, не указывая ширину, соотношение сторон также будет сохранено.Для того, чтобы отключить сохранение соотношения сторон, необходимо установить следующий параметр в файле flashphoner.propertiesсторон также будет сохранено.

Для того, чтобы отключить сохранение соотношения сторон, необходимо установить следующий параметр в файле flashphoner.properties

Code Block
themeRDark
video_transcoder_preserve_aspect_ratio=false

При этом поток будет транскодирован к тем ширине и высоте кадра, которые запрашивает подписчик. Если высота не указана подписчиком, будет установлена высота картинки 120. Если ширина не указана подписчиком, будет установлена ширина картинки 160.

Округление ширины картинки при сохранении соотношения сторон

В сборке 5.2.1842 добавлена возможность указать округление ширины картинки при включенном сохранении соотношения сторон. По умолчанию, ширина округляется в меньшую сторону:

Code Block
themeRDark
video_transcoder_round_ratio=0

Например, при транскодировании картинки 1280x720 к разрешению 480p по умолчанию будет получена картинка 852x480. Настройка

Code Block
themeRDark
video_transcoder_round_ratio=1

включает округление в большую сторону: в этом случае будет получена картинка 854x480.

Соотношение сторон для вертикального видео

Начиная со сборки 5.2.1911, WCS определяет ориентацию публикуемого потока по ширине и высоте кадра и поддерживает соотношение сторон следующим образом:

1. Для горизонтального видео (ширина картинки больше либо равна высоте) значение height  из профиля транскодирования применяется к высоте, ширина транскодируемого потока вычисляется по высоте. Например, для потока 1920x1080 (16:9) при заказанном транскодинге с height: 360  результат будет иметь разрешение 640x360.

2. Для вертикального видео (ширина картинки меньше высоты) значение height  из профиля транскодирования применяется к ширине, высота транскодируемого потока вычисляется по ширине. Например, для потока 1080x1920 (9:16) при заказанном транскодинге с height: 360  результат будет иметь разрешение 360x640.

Синхронизация аудио и видео на выходе транскодера

По умолчанию, транскодер не синхронизирует аудио и видео в выходном потоке, оставляя значение синхронизации как есть. Это может приводить к несовпадению звука и видео в транскодированном потоке. Чтобы этого избежать, в сборке 5.2.543 добавлен выравнивающий буфер, который включается настройкой

Code Block
themeRDark
av_paced_sender=true

Размер выравнивающего буфера задается в кадрах настройкой

Code Block
themeRDark
av_paced_sender_max_buffer_size=5000

По умолчанию размер буфера составляет 5000 кадров

Для контроля работы выравнивающего буфера используется статистика, получаемая при помощи запроса

Code Block
languagebash
themeRDark
curl -s 'http://localhost:8081/?action=stat&format=json&groups=buffer_stats'

Добавление водяного знака в определенный поток

В сборке 5.2.693 появилась возможность добавлять в выходной поток транскодера водяной знак при создании транскодера по REST API, например

Code Block
languagejs
themeRDark
{
 "uri": "transcoder://tcode1",
 "remoteStreamName": "test",
 "localStreamName": "testT",
 "encoder": {
  "width": 640,
  "height": 480,
  "keyFrameInterval": 30,
  "fps": 30,
  "watermark": "Test.png"
 }
}

Если имя файла указано без пути, файл должен располагаться в каталоге /usr/local/FlashphonerWebCallServer/conf. Можно также указать полный путь к файлу, например

Code Block
languagebash
themeRDark
{
 "uri": "transcoder://tcode1",
 "remoteStreamName": "test",
 "localStreamName": "testT",
 "encoder": {
  "width": 640,
  "height": 480,
  "keyFrameInterval": 30,
  "fps": 30,
  "watermark": "/opt/media/Test.png"
 }
}

Динамическое добавление и изменение водяного знака

В сборке 5.2.1349 добавлена возможность динамически добавлять и изменять водяной знак, не останавливая транскодер. Водяной знак может быть добавлен, изменен или перемещен в соответствии с указанными координатами при помощи REST API запроса /transcoder2/set_watermark 

Code Block
languagejs
themeRDark
{
 "uri":"transcoder2://tcode1",
 "watermark":"/opt/media/logo.png",
 "x":10,
 "y":10,
 "marginTop":5,
 "marginLeft":5,
 "marginBottom":5,
 "marginRight":5
}

Здесь

  • watermark - имя файла водяного знака
  • x, y - координаты верхнего левого угла водяного знака на картинке потока
  • marginTop, marginLeft, marginBottom, marginRignt - отступы от границ картинки потока

Если координаты выходят за границы картинки потока, водяной знак будет вписан в эти границы с учетом отступов.

Для того, чтобы переместить водяной знак в другое место на картинке, необходимо отправить запрос с тем же файлом, но новыми координатами. Чтобы убрать водяной знак с картинки, необходимо отправить запрос с пустым полем watermark 

Code Block
languagejs
themeRDark
{
 "uri":"transcoder2://tcode1",
 "watermark":""
}

Многопоточное кодирование

В сборке 5.2.816 добавлена возможность многопоточного кодирования при использовании кодировщика на базе OpenH264. Количество потоков кодирования устанавливается следующей настройкой

Code Block
themeRDark
video_encoder_max_threads=2

По умолчанию, количество потоков установлено в 2.

Многопоточное кодирование включается в зависимости от разрешения выходного потока транскодера. Граница устанавливается при помощи следующей настройки

Code Block
themeRDark
video_transcoderencoder_preservesecond_aspectthread_ratio=false

При этом поток будет транскодирован к тем ширине и высоте кадра, которые запрашивает подписчик. Если высота не указана подписчиком, будет установлена высота картинки 120. Если ширина не указана подписчиком, будет установлена ширина картинки 160.

Синхронизация аудио и видео на выходе транскодера

По умолчанию, транскодер не синхронизирует аудио и видео в выходном потоке, оставляя значение синхронизации как есть. Это может приводить к несовпадению звука и видео в транскодированном потоке. Чтобы этого избежать, в сборке 5.2.543 добавлен выравнивающий буфер, который включается настройкой

Code Block
themeRDark
av_paced_sender=true

Размер выравнивающего буфера задается в кадрах настройкой

Code Block
themeRDark
av_paced_sender_max_buffer_size=5000

По умолчанию размер буфера составляет 5000 кадров

...

threshold=777000

Значение представляет собой произведение ширины картинки на высоту. Таким образом, по умолчанию в несколько потоков кодируются картинки разрешением 720p. При необходимости, этот порог можно понизить. Например, для того, чтобы кодировать в несколько потоков картинки 480p, установите значение

Code Block
themeRDark
video_encoder_second_thread_threshold=408950

Определение индентификатора профиля кодирования H264

В сборке 5.2.1644 добавлен инструмент, при помощи которого можно определить идентификатор профиля кодирования H264 по параметрам кодирования:

Code Block
languagebash
themeRDark
sudo bash /usr/local/FlashphonerWebCallServer/tools/h264_profile_tool.sh --config=codec,resolution,profile,level[,preset]

Здесь

Например, для следующих параметров

Code Block
languagebash
themeRDark
curlsudo -s 'http://localhost:8081/?action=stat&format=json&groups=buffer_stats'

Добавление водяного знака в определенный поток

...

bash /usr/local/FlashphonerWebCallServer/tools/h264_profile_tool.sh --config="OPENH264,1280x720,66,31,ultrafast"

на консоль будет выведен идентификатор

Code Block
languagejsbash
themeRDark
{
 "uri": "transcoder://tcode1",
 "remoteStreamName": "test",
 "localStreamName": "testT",
 "encoder": {
  "width": 640,
  "height": 480,
  "keyFrameInterval": 30,
  "fps": 30,
  "watermark": "Test.png"
 }
}

...

42c01f <= "OPENH264,66,31,ultrafast,1280x720"

Также при помощи инструмента можно получить список всех поддерживаемых профилей для всех кодировщиков

Code Block
languagebash
themeRDark
sudo bash /usr/local/FlashphonerWebCallServer/tools/h264_profile_tool.sh --catalog --output=catalog.csv

или для определенного кодировщика

Code Block
languagebash
themeRDark
sudo bash /usr/local/FlashphonerWebCallServer/

...

tools/h264_profile_tool.sh --catalog --encoders=OPENH264 --output=openH264.csv

Список выводится в файл в формате CSV

Code Block
themeRDark
codec,profile,level,preset,resolution,profile-level-id

например

Code Block
languagebash
themeRDark
{
 "uri": "transcoder://tcode1",
 "remoteStreamName": "test",
 "localStreamName": "testT",
 "encoder": {
  "width": 640,
  "height": 480,
  "keyFrameInterval": 30,
  "fps": 30,
  "watermark": "/opt/media/Test.png"
 }
}

Многопоточное кодирование

...

FF,0,0,fast,320x180,42c01e
...

Если библиотеки кодировщика нет в поставке сервера, то при запросе  идентификатора профиля инструмент выведет ошибку

Code Block
themeRDark
Unable to create instance of encoder: FF

а при запросе списка профилей выведет ошибку

Code Block
themeRDark
Unsupported encoder: FF

и создаст CSV файл нулевой длины.

Известные проблемы

1. Настройка качества кодирования не применяется при использовании OpenH264

Симптомы: качество картинки в плеере не изменяется при различных значениях настройки constraints.video.quality , например

Code Block
themeRDark
video_encoder_max_threads=2

По умолчанию, количество потоков установлено в 2.

...

constraints.video.quality=5

не отличается от 

Code Block
themeRDark
constraints.video.quality=20

Решение: не использовать кодирование на базе OpenH264, поскольку управление CRF в нем не поддерживается

Code Block
themeRDark
video_encoder_second_thread_threshold=777000

...

priority=FF

2. Если файл водяного знака поврежден, либо файл отсутствует, используется водяной знак по умолчанию (черная картинка)

Симптомы: при добавлении водяного знака в выходном потоке черный экран, в серверном логе сообщение

Code Block
themeRDark
video_encoder_second_thread_threshold=408950Wrong watermark file format. Should be PNG.

Решение: использовать только PNG файл с корректной структурой для добавления водяного знака.