Стабильная работа при низком интернете

Daniil_Denisov

New Member
Здравствуйте. Для более качественной связи мы используем автоматическое ухудшение и улучшение видео канала. Для того, чтобы не перезагружать стрим, мы используем canvas и customStream. Но при ухудшении качества изображения до width: '80', height: '60', при скорости интернета 30 KB/s видео и аудио транслируется без потерь и задержек, но через какое-то время(примерно 4-5 минуты) качество видео ухудшается еще сильнее, хотя качество отправляемого изображения через canvas не ухудшается.

Еще хотелось узнать, как повысить приоритет у аудио канала. Чтобы при недостаточной скорости интернета основные ресурсы уходили на отправку аудио. Видео и аудио стримы разделены.
 

Max

Administrator
Staff member
Добрый день
Но при ухудшении качества изображения до width: '80', height: '60', при скорости интернета 30 KB/s видео и аудио транслируется без потерь и задержек, но через какое-то время(примерно 4-5 минуты) качество видео ухудшается еще сильнее, хотя качество отправляемого изображения через canvas не ухудшается.
Локальное видео и не будет ухудшаться.
WebRTC - протокол, предусматривающий адаптацию публикации под канал. Допустим, Вы публикуете поток 80x60 30 fps H264 видео + 48 кГц Opus аудио. При этом битрейт видео будет в среднем около 70 кбит/с, при движениях в кадре до 100-200 кбит/с, плюс 20-30 кбит/с битрейт аудио.
Теперь Вы ограничиваете канал до 30 кбит/с. Браузер будет пытаться снижать разрешение, но его снижать уже некуда (и в последних сборках Web SDK по умолчанию настроено так, чтобы удерживать разрешение), поэтому браузер сбрасывает битрейт в соответствии с пропускной способностью канала. Битрейт видео ниже 30 кбит/с - это очень мыльное изображение с макроблоками.
Еще хотелось узнать, как повысить приоритет у аудио канала. Чтобы при недостаточной скорости интернета основные ресурсы уходили на отправку аудио. Видео и аудио стримы разделены.
Публикация различных стримов - это разные процессы для браузера. Поэтому изменить их приоритет друг относительно друга невозможно.
Вы можете настроить контроль качества канала, и при ухудшении качества останавливать публикацию видео, оставляя только аудио.
Вообще говоря, каналы до 100 кбит/с и не предназначены для передачи видео из-за снижения качества при низких битрейтах. Поэтому при плохом канале целесообразно транслировать только аудио.
 

Daniil_Denisov

New Member
Спасибо за ответ. Мы разобрались с этой проблемой, но теперь появилась новая, которая касается этой же темы. У нас также разделены видео и аудио стримы. Также мы отслеживаем качества соединения у клиента с помощью подписки на CONNECTION_QUALITY.UPDATE. Когда у пользователя несколько раз приходит сообщение "BAD", мы перезапускаем его видео стрим(не трогая аудио) с более низкими настройками качества(снижаем ширину, высоту, минимальный и максимальный битрейт, фрейм рейт).
Так как не хватало скорости интернета для отдачи видео и аудио, перед перезапуском стрима, видео и аудио поток зависали. После перезапуска стрима в низком качестве, в среднем, через 7 секунд восстанавливался аудио поток и воспроизводилось то, что говорил пользователь во время перезапуска видео стрима, спустя еще 5 секунд задержка пропадает и воспроизводиться то, что говорит пользователь в реальном времени. Есть ли возможность сократить это 12-ти секундную задержку?

Вот наши настройки видео и аудио стримов.
Аудио:
JavaScript:
{
  name: `${streamId}#mixer-${roomId}`,
  display: this.localVideo,
  cacheLocalResources: true,
  receiveVideo: false,
  receiveAudio: false,
  transport: 'UDP',
  constraints: {
    audio: audioDeviceId.deviceId ? audioDeviceId : true,
    video: false,
   },
 }
Видео:

JavaScript:
const config = {
      name: streamId,
      display: this.localVideo,
      cacheLocalResources: true
      receiveVideo: false,
      receiveAudio: false,
      transport: 'UDP',
      constraints: {
        audio: false,
        video: {
                deviceId: videoDeviceId,
                width: qualityConfig.width,
                height: qualityConfig.height,
                minBitrate: qualityConfig.minBitrate,
                maxBitrate: qualityConfig.maxBitrate,
                cacheLocalResources: true,
                frameRate: qualityConfig.frameRate,
                videoContentHint: 'motion',
              },
    }
 

Max

Administrator
Staff member
Есть ли возможность сократить это 12-ти секундную задержку?
Судя по примерам кода, Вы транслируете аудио с выхода микшера, а видео напрямую. Скорее всего, задержка связана с буферизацией потока в микшере при ухудшении его качества. Отметим, что при такой трансляции невозможно синхронизировать видео и аудио, т.к. это два разных источника.
Если Вы имеете дело с очень плохими каналами, рекомендуем не использовать видео вообще.
Также, можно попробовать переключиться на TCP транспорт, это поможет компенсировать потери.
 
Top