为什么从Android通过WebRTC流式传输时video分辨率会发生变化

我正在尝试使用WebRTC从Android上的Chrome浏览器以640×480流式传输,video从此开始,但随后分辨率降至320×240。

以下是发送的getUserMedia参数:

"getUserMedia": [ { "origin": "http://webrtc.example.com:3001", "pid": 30062, "rid": 15, "video": "mandatory: {minWidth:640, maxWidth:640, minHeight:480, maxHeight:480}" } 

我的问题是为什么决议下降了? 当我在我的Mac上从Chrome上试用它时,这种情况不会发生。 我想进行调整,以便video分辨率不会改变。

使用ffmpeg转储的video帧

chrome:// webrtc-internals文本转储

我正在使用Licode WebRTC流媒体服务器,但也看到了使用Kurento的相同行为。

  • Android应用程序在addAccountExplicitly(帐户,密码,null)崩溃;
  • 按下时更改图像视图的源图像
  • 单击Android浏览器绿色边框
  • 未findGoogle Vision条形码库
  • 如何在Android中确保数字十进制键盘?
  • 期待,得到'?'
  • 我的视图如何响应鼠标滚轮?
  • 通过Chrome意图将引荐来源数据传递到Google Play
  • getUserMedia约束仅影响从浏览器请求到硬件的媒体并作为流返回。 getUserMedia约束对之后对该流所做的事情没有任何影响(即,当它通过连接流式传输时)。 您看到的降级是在PeerConnection层中,而不是在getUserMedia层中。 当硬件和带宽统计数据表明性能低下时,webrtc实施会触发降级,并由双方协商。

     [Hardware] < - getUserMedia -> [javascript client] < - PeerConnection -> [another client] < - 640x480 captured -> < - 320x240 sent -> 

    您将不得不深入研究源代码以获取文档以及在每个实现中如何完成它的证据,但是对行为的引用:

    来自WebRTC的OReilly章节 :

    好消息是,WebRTC音频和video引擎与底层网络传输协同工作,以探测可用带宽并优化媒体流的传输。 但是,DataChannel传输需要额外的应用程序逻辑:应用程序必须监视缓冲数据的数量,并准备好根据需要进行调整。

    WebRTC音频和video引擎将动态调整媒体流的比特率以匹配对等体之间的网络链路的条件。 应用程序可以设置和更新媒体约束(例如,video分辨率,帧速率等),引擎完成剩下的工作 – 这部分很容易。