Описание

При публикации WebRTC потока с мобильного устройства, ориентация устройства может быть изменена. Устройства на базе Android при этом самостоятельно поворачивают изображение, а устройства на базе iOS передают признак ориентации картинки в потоке

Значение признака

Угол поворота в градусах

0

0

1

90

2

180

3

270

Изображение поворачивается по часовой стрелке.

Публикация WebRTC потока с признаком ориентации картинки

Для публикации WebRTC потока с признаком ориентации картинки необходимо передать параметр cvoExtension в функцию createStream()

    session.createStream({
        name: streamName,
        ...
        cvoExtension: true
    }).publish();

Воспроизведение потока с признаком ориентации картинки как RTMP

Для воспроизведения потока с признаком ориентации картинки как RTMP требуется поддержка со стороны плеера. Так, в пример Flash Streaming необходимо добавить следующий код:

            public function onMetaData(info:Object):void {
                Logger.info("Video orientation " + info.orientation);
                revertVideoFarEndPos();
                if (info.orientation == 0) {
                    videoFarEnd.rotation = 0;
                } else if (info.orientation == 1) {
                    videoFarEnd.rotation = 90;
                    videoFarEnd.x = videoFarEnd.x + videoFarEnd.width;
                } else if (info.orientation == 2) {
                    videoFarEnd.rotation = 180;
                    videoFarEnd.x = videoFarEnd.x + videoFarEnd.width;
                    videoFarEnd.y = videoFarEnd.y + videoFarEnd.height;
                } else if (info.orientation == 3) {
                    videoFarEnd.rotation = 270;
                    videoFarEnd.y = videoFarEnd.y + videoFarEnd.height;
                }
                videoFarEndOrientation = info.orientation;
            }

            public function revertVideoFarEndPos():void {
                if (videoFarEndOrientation == 1) {
                    videoFarEnd.x = videoFarEnd.x - videoFarEnd.width;
                } else if (videoFarEndOrientation == 2) {
                    videoFarEnd.x = videoFarEnd.x - videoFarEnd.width;
                    videoFarEnd.y = videoFarEnd.y - videoFarEnd.height;
                } else if (videoFarEndOrientation == 3) {
                    videoFarEnd.y = videoFarEnd.y - videoFarEnd.height;
                }
            }

При использовании транскодинга, например, при публикации потока VP8+opus, для того чтобы плеер получил признак ориентации транскодированного потока, необходимо в файле flashphoner.properties установить следующую настройку

video_filter_enable_rotate=true

При использовании CDN, эту настройку необходимо установить на всех серверах CDN, с которых предполагается воспроизведение RTMP потока.

Особенности трансляции с мобильных устройств

Если разрешен поворот экрана мобильного устройства, то при повороте устройства будет меняться соотношение сторон картинки от портретного к ландшафтному и наоборот.

Если поворот экрана устройства запрещен (например, установлен переключатель Lock Portrait Orientation), то при повороте устройства соотношение сторон остается тем, же, что и в начале публикации, но картинка поворачивается в соответствии с ориентацией устройства.

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

1. iOS Safari не высылает ориентацию картинки при повороте на 180 градусов (устройство вверх ногами)

2. Safari в iOS 12 перестает высылать видео пакеты при повороте направо на 90 градусов (из портретной в ландшафтную ориентацию)

3. При публикации с Android устройств соотношение сторон картинки меняется при повороте независимо от значения параметра cvoExtension