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

Jay*_* P. 14 video android google-chrome video-processing webrtc

我正在尝试使用WebRTC从Android上的Chrome浏览器以640x480流式传输,视频从此开始,但随后分辨率降至320x240.

以下是发送的getUserMedia参数:

 "getUserMedia": [
  {
   "origin": "http://webrtc.example.com:3001",
   "pid": 30062,
   "rid": 15,
   "video": "mandatory: {minWidth:640, maxWidth:640, minHeight:480, maxHeight:480}"
  }
Run Code Online (Sandbox Code Playgroud)

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

使用ffmpeg转储的视频帧

chrome:// webrtc-internals文本转储

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

xdu*_*ine 11

getUserMedia约束仅影响从浏览器请求的媒体到硬件并作为流返回.getUserMedia约束对之后对该流所做的事情没有任何影响(即,当它通过连接流式传输时).您所看到的退化是在PeerConnection图层中,而不是在getUserMedia图层中.当硬件和带宽统计数据表明性能低下时,webrtc实施会触发降级,并由双方协商.

[Hardware] <-   getUserMedia   -> [javascript client] <- PeerConnection -> [another client]
           <- 640x480 captured ->                     <-  320x240 sent  ->
Run Code Online (Sandbox Code Playgroud)

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

来自ORRilly的WebRTC章节:

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

...

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