Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

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

Транскодинг видеопотока включается автоматически в одном из следующих случаев:

1. Кодеки стримера и плеера не совпадают по имени.
Например, стример отправляет H.264, плеер пытается играть VP8.

2. Кодеки H.264 отличаются по параметру packetization-mode
Например стример отправляет packetization-mode=1 (по умолчанию), а плеер явно указывает packetization-mode=0. Ситуация достаточно редкая, т.к. почти все устройства поддерживают packetization-mode=1

3. Явно указано разрешение плеера.
Пример:

session.createStream({name:"stream1", constraints:{audio:true, video:{width:640,height:480}}}).play();

Если плеер явно указал желаемое разрешение, то транскодинг включится даже в том случае, когда указанное плеером разрешение совпадает с тем, что указал стример. Так сделано, поскольку WebRTC браузер может менять разрешение видео во время публикации. Для того, чтобы привести поток к разрешению, указанному плеером, необходимо транскодировать поток.

4. Явно указан битрейт плеера.

Пример

session.createStream({name:"stream1", constraints:{audio:true, video:{bitrate:300}}}).play();

В этом случае транскодер включается, чтобы кодировать поток в заданный битрейт.

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

disable_streaming_proxy=true

Транскодинг значительно увеличивает потребление ресурсов сервера (процессорных ядер). Поэтому включать его следует с осторожностью!

Принудительное отключение транскодинга

Транскодинг может быть полностью отключен на сервере при помощи параметра в файле flashphoner.properties

transcoding_disabled=true

Если транскодинг принудительно отключен, во всех четырех случаях, перечисленных выше, клиенту возвращается ошибка TRANSCODING_REQUIRED_BUT_DISABLED.

Отключение транскодинга не влияет на микшер, при использовании микшера транскодинг будет включаться.

Управление транскодингом при помощи REST API

REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:

Здесь:

  • test.flashphoner.com - адрес WCS-сервера
  • 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8444 - стандартный HTTPS порт
  • rest-api - обязательная часть URL
  • /transcoder/startup - используемый REST-метод

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

REST-метод

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

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

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

Описание

/transcoder/startup

{
 "uri": "transcoder://tcode1",
 "remoteStreamName": "test",
 "localStreamName": "testT",
 "encoder": {
  "width": 640,
  "height": 480,
  "keyFrameInterval": 30,
  "fps": 30
 }
}

409 - Conflict

500 - Internal error


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


/transcoder/find
{
 "remoteStreamName": "test"
}
[
    {
        "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 – транскодеры найдены

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

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

/transcoder/find_all


[
    {
        "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 – транскодеры найдены

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

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

/transcoder/terminate

{
"uri":"transcoder://tcode1"
}

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

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

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

Параметры

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

Описание

Пример

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

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

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

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

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

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

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

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

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

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

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

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

video_transcoder_preserve_aspect_ratio=false

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

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

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

av_paced_sender=true

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

av_paced_sender_max_buffer_size=5000

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

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

curl -s 'http://localhost:8081/?action=stat&format=json&groups=buffer_stats'
  • No labels