Как назначить bitrate для screen sharing?

Есть ли какой-то пример? Капчу используя chrome extension. Битрейт браузер какой хочет такой и назначает, чаще всего слишком маленький и видео выглядит так себе, с полосой для данного применения проблем вообще нет, можно хоть 100 мегабит жрать, но почему-то больше 1.5-2 не хочет, а иногда даже 1 мбит, что даёт естественно, ну очень плохое видео для Full HD разрешения. Как назначить битрейт принудительно? Вижу настройки в constraints для screen sharing для разрешения и фреймрейта, а для битрейта - не вижу!
 

Max

Administrator
Staff member
Настройки для битрейта в constraints описаны здесь, см также пример Media Devices, но в Chrome наиболее эфеективно управление битрейтом через замену параметров SDP, см здесь, как заменять, и здесь, какие именно параметры SDP установить для увеличения битрейта (x-google-max-bitrate, x-google-min-bitrate).
Можно также ограничить битрейт со стороны сервера настройкой
Code:
webrtc_cc_min_bitrate=5000000
Здесь указана нижняя граница в 5 Мбит/с как пример. Однако, как показали наши опыты, если не устанавливать параметры SDP в Chrome, данный браузер будет держать битрейт не выше 2.5 Мбит/с, возможно, это значение прописано в x-google-max-bitrate по умолчанию.
 

Max

Administrator
Staff member
Каким именно способом ограничиваете битрейт? Через SDP должно работать, при условии, что канал до сервера это позволяет.
Попробуйте на примере Media Devices, как описано здесь, при этом на сервере поставьте, например:
Code:
webrtc_cc_min_bitrate=3000000
webrtc_cc_max_bitrate=7000000
 

angedonik

Member
а можно ли указать битрейт для customStream? В сочетании с webrtc_cc_min_bitrate и webrtc_cc_max_bitrate пробовали так:
Code:
  chrome.tabCapture.capture({audio: true, video: true}, stream => {
      const serverUrl=ffServer;

      Flashphoner.init({});
      const setStatus=function(status, stream) {
          console.log(status);
      };
      Flashphoner.createSession({urlServer: serverUrl}).on(SESSION_STATUS.ESTABLISHED, function(session){
        let streamInfo={
          name: streamName,
          constraints: {
              customStream: stream.clone(),
              video: false
          },
          display:document.body,
          record: true,
          receiveAudio: false,
          receiveVideo: false,
          sdpHook: (sdp) => {
              const a = sdp.sdpString.toString().replace(/a=fmtp:(.*) (.*)\r\n/g, "a=fmtp:$1 $2;x-google-max-bitrate=50000000;x-google-min-bitrate=30000000\r\n");

            console.log(a);
            //   console.log(a);
              return a;
          }
      };
        session.createStream(streamInfo).on(STREAM_STATUS.PUBLISHING, function(publishStream){
            setStatus(STREAM_STATUS.PUBLISHING);
        }).on(STREAM_STATUS.UNPUBLISHED, function(){
            setStatus(STREAM_STATUS.UNPUBLISHED);
        }).on(STREAM_STATUS.FAILED, function(stream){
            setStatus(STREAM_STATUS.FAILED, stream);
        }).publish();
    }).on(SESSION_STATUS.DISCONNECTED, function(){
        setStatus(SESSION_STATUS.DISCONNECTED);
    }).on(SESSION_STATUS.FAILED, function(){
        setStatus(SESSION_STATUS.FAILED);
    });
    });
Но битрейт всё равно выходит случайным, независимо от x-google-max-bitrate и x-google-min-bitrate.
 

Max

Administrator
Staff member
Добрый день.
Мы создали тикет на данную проблему (WCS-1718), проверим и сообщим о результатах.
 
Есть ли тут апдейт? Наш партнёр весьма опечален неуправляемостью полосы скриншары
 

Max

Administrator
Staff member
Добрый день.
Мы работаем над этим. Похоже, в последних версиях Chrome разработчики опять что-то поправили, и изменение битрейта через SDP перестало работать.
 

Max

Administrator
Staff member
Добрый день.
Мы протестировали изменение битрейта через SDP в последней версии Chrome 71.0.3578.98, параметры x-google-max-bitrate и x-google-min-bitrate работают как при публикации потока с веб-камеры, так и с экрана. Битрейт в этих параметрах должен быть указан в килобитах в секунду, например
Code:
a=fmtp:$1 $2;x-google-max-bitrate=5000;x-google-min-bitrate=3000
В вашем примере указаны значения, возможно, в битах в секунду (как в настройках webrtc_cc_min_bitrate, webrtc_cc_max_bitrate)
Code:
a=fmtp:$1 $2;x-google-max-bitrate=50000000;x-google-min-bitrate=30000000
Chrome считает их слишком большими и отбрасывает, ограничивая битрейт максимальным значением 2500 кбит/с, нижний предел при этом не контролируется.
 

angedonik

Member
Так же выглядит и при x-google-max-bitrate=5000;x-google-min-bitrate=3000.
Используется Chromium 71.0.3578.98 Built on Ubuntu , running on Ubuntu 16.04
 

Max

Administrator
Staff member
Мы протестируем пример Screen Sharing под Ubuntu. Просим сообщить, воспроизводится ли проблема в Chrome под Windows?
 

angedonik

Member
Screensharing сам по себе работает качественно. Хватает параметров, которые можно передать при паблише стриме. Проблема именно для
customStream в коде приведённом выше. Там используется chrome.tabCapture.capture
 
Ага, то есть это не скриншаринг. Это custom stream который берётся из tabCapture. Там просто звук есть, фокус был в том что нам звук с десктопа нужен, так что screen capture не катит, только tab capture.
 

Max

Administrator
Staff member
Добрый день.
Спасибо за уточнение. Мы проверим возможность регулировки битрейта для customStream.
 

Max

Administrator
Staff member
Добрый день.
Мы воспроизвели снижение битрейта под Ubuntu. Проблема возникает при использовании кодека H264, если использовать VP8, проблема не воспроизводится.
Рекомендуем исключить кодек H264 при помощи параметра stripCodecs при создании потока, например
Code:
    session.createStream({
        name: streamName,
        display: localVideo,
        constraints: constraints,
        stripCodecs: "h264,H264",
        sdpHook: sdpHook
Кроме того, через SDP можно увеличить ширину канала:
Code:
function sdpHook(sdp) {
    //увеличиваем ширину канала до 10 мбит/сек
    var sdpStringFind1 = "c=IN (.*)\r\n";
    var sdpStringReplace1 = "c=IN $1\r\nb=AS:10000\r\n";

    //чтобы быстрее разогнать битрейт используем x-google-min/max-bitrate
    var sdpStringFind2 = "a=rtpmap:(.*) VP8/90000\r\n";
    var sdpStringReplace2 = "a=rtpmap:$1 VP8/90000\r\na=fmtp:$1 x-google-min-bitrate=4000;x-google-max-bitrate=5000\r\n";

    var newSDP = sdp.sdpString.toString();
    newSDP = newSDP.replace(new RegExp(sdpStringFind1, "g"), sdpStringReplace1);
    newSDP = newSDP.replace(new RegExp(sdpStringFind2, "g"), sdpStringReplace2);
    return newSDP;

    return sdp.sdpString;
}
В наших тестах при шаринге вкладки битрейт снижался только при статичной картинке, но так и должно быть.
 
Да, стало качественно лучше, по сути проблемы качества при tabCapture у нас больше нет. Вот при обычном screen sharing (с Mac/Windows) некоторое ощущение неконтролируемости полосы осталось. Кажется реально потребляется существенно меньше чем мы просим/чем доступно. Но проблема не убийственная.
 
```
constraints = {
video: {
width: 1920,
height: 1080,
frameRate: { max: 30 },
minBitrate: 4000000,
maxBitrate: 6000000,
type: 'screen',
mediaSource: 'screen'
}
};
```
Мега вопрос - а тут случайно minBitrate и maxBitrate не стал килобитами?
 
Top