【问题标题】:Why does video resolution change when streaming from Android via WebRTC为什么通过 WebRTC 从 Android 流式传输时视频分辨率会发生变化
【发布时间】:2015-08-24 21:58:39
【问题描述】:

我正在尝试使用 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}"
  }

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

video frames dumped using ffmpeg

chrome://webrtc-internals text dump

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

【问题讨论】:

  • 我知道 Vp8 由于延迟(网络或处理)而动态改变帧大小。

标签: android google-chrome video webrtc video-processing


【解决方案1】:

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

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

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

来自OReilly Chapter on WebRTC

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

...

WebRTC 音频和视频引擎将动态调整媒体流的比特率,以匹配对等点之间的网络链接条件。应用程序可以设置和更新媒体约束(例如,视频分辨率、帧率等),其余的由引擎完成——这部分很简单。

【讨论】:

  • 似乎无法像我预期的那样强制解决。我们使用 ffmpeg 对视频进行后处理以标准化分辨率。
  • @JayP。除非如果修改 webrtc 的源代码并在本机桌面应用程序或移动设备的某个地方的浏览器环境之外使用这个新修改的二进制文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
相关资源
最近更新 更多