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

Discussion in 'Общие вопросы' started by Alexander Novikov, Nov 16, 2018.

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

    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 по умолчанию.
  3. Не удаётся ( упорно полоса остается 1-2 мбит/с и не больше.
  4. Max

    Max Administrator Staff Member

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

    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.
  6. Max

    Max Administrator Staff Member

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

    Max Administrator Staff Member

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

    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 кбит/с, нижний предел при этом не контролируется.
  10. angedonik

    angedonik Member

    Пробовали
    Code:
    sdp.sdpString.toString().replace(/a=fmtp:(.*) (.*)\r\n/g, "a=fmtp:$1 $2;x-google-max-bitrate=10000;x-google-min-bitrate=2000\r\n")
    
    Ничего не изменилось. bitrate: 901 kb/s

    Attached Files:

  11. angedonik

    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
  12. я двачую это
  13. Max

    Max Administrator Staff Member

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

    angedonik Member

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

    Max Administrator Staff Member

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

    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;
    }
    
    В наших тестах при шаринге вкладки битрейт снижался только при статичной картинке, но так и должно быть.
  18. У нас и так был VP8, но остальная часть совета кажется помогла. Спасибо!
  19. Да, стало качественно лучше, по сути проблемы качества при tabCapture у нас больше нет. Вот при обычном screen sharing (с Mac/Windows) некоторое ощущение неконтролируемости полосы осталось. Кажется реально потребляется существенно меньше чем мы просим/чем доступно. Но проблема не убийственная.
  20. ```
    constraints = {
    video: {
    width: 1920,
    height: 1080,
    frameRate: { max: 30 },
    minBitrate: 4000000,
    maxBitrate: 6000000,
    type: 'screen',
    mediaSource: 'screen'
    }
    };
    ```
    Мега вопрос - а тут случайно minBitrate и maxBitrate не стал килобитами?

Share This Page