Versions Compared

Key

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

...

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
/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-методы и статусы ответа

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

Описание

Пример

uri

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

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

status

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

PROCESSED_LOCAL

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,
  "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

Краткое руководство по тестированию

1. Для тестирования используем

  • WCS-сервер;
  • Веб-приложение Two Way Streaming для публикации потока;
  • Веб-приложение Player для воспроизведения выходного потока транскодера;
  • браузер Chrome и REST-клиент для отправки запросов на сервер

2. Откройте приложение Two Way Streaming, опубликуйте поток test

Image Removed

3. Откройте REST-клиент, отправьте запрос /transcoder/startup

Image Removed

4. Откройте веб-приложение Player, укажите в поле Stream имя потока testT и нажмите Start

Image Removed

5. Откройте REST-клиент, отправьте запрос /transcoder/terminate

Image Removed

6. Воспроизведение потока останавливается в связи с остановкой транскодера

Image Removed

Сохранение соотношения сторон видео при транскодинге

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

...

audioChannelsКоличество каналов аудио2
audioBitrateБитрейт аудио, бит/с64000
videoCodecКодек видеоH264
keyFrameIntervalЧастота генерации ключевых кадров (GOP)
30
fpsЧастота кадров в секунду
30
bitrateБитрейт видео в кб/с
500
typeКодировщик
OPENH264
watermarkФайл водяного знакаTest.png
videoRateЧастота дискретизации видео, Гц90000

Ограничения

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

Краткое руководство по тестированию

1. Для тестирования используем

  • WCS-сервер;
  • Веб-приложение Two Way Streaming для публикации потока;
  • Веб-приложение Player для воспроизведения выходного потока транскодера;
  • браузер Chrome и REST-клиент для отправки запросов на сервер

2. Откройте приложение Two Way Streaming, опубликуйте поток test

Image Added

3. Откройте REST-клиент, отправьте запрос /transcoder/startup

Image Added

4. Откройте веб-приложение Player, укажите в поле Stream имя потока testT и нажмите Start

Image Added

5. Откройте REST-клиент, отправьте запрос /transcoder/terminate

Image Added

6. Воспроизведение потока останавливается в связи с остановкой транскодера

Image Added

Сохранение соотношения сторон видео при транскодинге

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

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

Code Block
themeRDark
video_transcoder_preserve_aspect_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 кадров

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

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_ratiothreshold=false

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

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

...

777000

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

Code Block
themeRDark
av_paced_sender=true

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

Code Block
themeRDark
av_paced_sender_max_buffer_size=5000

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

...

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 -sbash 'http:/usr/localhost:8081/?action=stat&format=json&groups=buffer_stats'

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

...

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"
 }
}

Если имя файла указано без пути, файл должен располагаться в каталоге /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.816 добавлена возможность многопоточного кодирования при использовании кодировщика на базе OpenH264. Количество потоков кодирования устанавливается следующей настройкой

Code Block
themeRDark
video_encoder_max_threads=2

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

...

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
themeRDark
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_second_thread_threshold=777000

...

constraints.video.quality=5

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

Code Block
themeRDark
constraints.video.quality=20

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

Code Block
themeRDark
video_encoder_second_thread_threshold=408950priority=FF