iOS Screen Capturer, fatal error в одной из последних версий фреймворка

Anton1984

Member
1. Есть ли возможность рекордить аудио с записи экрана?
2. При трансляции записи экрана, воспроизведение начинается только спустя 7-15 секунд в среднем, хоть картинка транслируется, и поток идет.
3. Проблема с записью стрима, при демонстрации экрана, запись стрима выглядит, как черный экран.
4.Креши внутри фреймоврка фонера — AVCaptureSession can't startRunning between calls to beginConfiguration / commitConfiguration.
 

Max

Administrator
Staff member
Добрый день.
1. Есть ли возможность рекордить аудио с записи экрана?
Да, есть возможность захватывать аудио с микрофона отдельным потоком. Смотрите пример iOS Screen Capturer Swift
2. При трансляции записи экрана, воспроизведение начинается только спустя 7-15 секунд в среднем, хоть картинка транслируется, и поток идет.
Здесь могут быть две причины:
1. Ключевые фреймы высылаются редко. В этом случае должна помочь настройка на стороне сервера
Code:
periodic_fir_request=true
periodic_fir_request_interval=5000
В этом случае сервер будет запрашивать ключевой фрейм каждые 5 секунд. На стороне клиента нет возможности повлиять на высылку ключевых фреймов, только на стороне сервера.
2. Проблемы с каналом публикации или воспроизведения. Эта причина более вероятна, поскольку экран транслируется всегда с полным разрешением, а разрешение это велико (фактически, 2K или 4K поток). Для таких потоков рекомендуется канал не менее 10 Мбит/с между клиентом и сервером. Также рекомендуется использовать TCP транспорт для публикации/проигрывания на стороне клиента, например
Code:
        let options = FPWCSApi2StreamOptions()
        options.name = publishName.text
        options.display = localDisplay.videoView
        options.constraints = localMediaConstrains;
        options.transport = "TCP";
        do {
            try publishStream = session!.createStream(options)
        } catch {
            print(error);
        }
        ...
        do {
            try publishStream?.publish()
        } catch {
            print(error);
        }
или на стороне сервера (для всех потоков)
Code:
ice_tcp_transport=true
3. Проблема с записью стрима, при демонстрации экрана, запись стрима выглядит, как черный экран.
Cкорее всего, та же проблема с каналом.
4.Креши внутри фреймоврка фонера — AVCaptureSession can't startRunning between calls to beginConfiguration / commitConfiguration.
Воспроизводится ли эта проблема в примере iOS Screen Capturer Swift, собранном из исходных текстов с GitHub? Если нет, то модифицируйте код примера минимально до тех пор, пока проблема не начнет воспроизводиться, и пришлите нам, используя эту форму.
 

Anton1984

Member
Да, есть возможность захватывать аудио с микрофона отдельным потоком. Смотрите пример iOS Screen Capturer Swift
Не совсем понятно как это реализовать, поскольку у нас все взаимодействие со стримами построено вокруг FPWCSRoomManager, у нас кейс стримов заключается в следующем:
- Есть активный стрим, который паблишит видео с камер и звук (через FPWCSRoomManager и FPWCSRoom непосредственно)
- Есть стрим с BroadcastUpload Extension (создается обычная сессия и стрим как в примере SDK)
- Клиент на веб приложении видит только тот стрим который паблишит комната
- через /rest-api/stream/inject/startup вставляем поток из BroadcastUpload Extension в стрим комнаты

Как в таком случае сделать чтобы был звук с микрофона? Схема с инъекцией потока BroadcastUpload Extension в комнату, и инъекция аудиопотока без видео в BroadcastUpload Extension не работает
 

Max

Administrator
Staff member
Как в таком случае сделать чтобы был звук с микрофона?
В таком случае поможет микширование: стрим с экрана + стрим с микрофона того, кто транслирует экран. И этот микшированный стрим вставлять в комнату. Создавать микшер и добавлять в него потоки можно через REST API.
Нет, на примере воспроизвести не удается, но вот что по логам.
В таком случае нужно модифицировать код примера до тех пор, пока проблема не начнет воспроизводиться. Другой вариант - подготовить минимальный пример на основе Вашего кода, в котором проблема будет устойчиво воспроизводиться. Код нужно прислать через эту форму.
 

Anton1984

Member
В таком случае поможет микширование: стрим с экрана + стрим с микрофона того, кто транслирует экран. И этот микшированный стрим вставлять в комнату. Создавать микшер и добавлять в него потоки можно через REST API.
Возможно как-то настроить стрим микшера так, чтобы только было видно тот стрим где есть видео (слева аудио стрим) ? И чтобы стрим микшера был по размеру 1:1 как тот что с видео (в данном случае трансляция экрана) ?
1643873855045.png
 

Max

Administrator
Staff member
Возможно как-то настроить стрим микшера так, чтобы только было видно тот стрим где есть видео (слева аудио стрим) ?
Да, настройкой на стороне сервера
Code:
mixer_show_separate_audio_frame=false
И чтобы стрим микшера был по размеру 1:1 как тот что с видео (в данном случае трансляция экрана) ?
Необходимо настроить размеры микшера так, чтобы соотношение сторон соответствовало портретному
Code:
mixer_video_width=720
mixer_video_height=1280
Имя потока трансляции экрана должно включать слово desktop (или другое слово, которое должно быть указано в настройке
Code:
mixer_video_layout_desktop_key_word=desktop
Чтобы поток трансляции экрана занимал весь экран, нужно включить режим "картинка-в-картинке":
Code:
mixer_video_desktop_fullscreen=true
Все эти параметры могут быть указаны как в настройках сервера (в этом случае они действуют на все микшеры), так и при создании конкретного микшера по REST API: Настройка микшера при создании по REST API
Code:
/rest-api/mixer/startup
{
    "localStreamName": "m1",
    "uri": "mixer://m1",
    "mixerVideoWidth": 720,
    "mixerVideoHeight": 1280,
    "mixerVideoLayoutDesktopKeyWord": "desktop", 
    "mixerVideoDesktopFullscreen": true,
    "mixerShowSeparateAudioFrame": false
}
 
Top