【问题标题】:Control video send framerate on the fly in webrtc在 webrtc 中动态控制视频发送帧率
【发布时间】:2015-03-27 14:06:20
【问题描述】:

现在我在 offer SDP 中使用 b=AS:1000 来设置上游视频的上限(即 1Mbps),以控制我发送给远程对等方的视频量。我正在研究一种不同的方法,所以我想知道是否有一种方法可以在当前活动视频会话的运行中控制视频帧速率?

编辑: 我发现 getUserMedia 支持 minFrameRate 和 maxFrameRate 参数。那么我可以在我的对等连接处于会话状态时调用 getUserMedia 吗?另一个合理的类似用例是能够在我已经处于对等会话中时更换相机?无需重新协商 SDP、ICE、……这可行吗?

【问题讨论】:

  • 你可以用控制包做一些事情,但不能通过浏览器。

标签: javascript webrtc


【解决方案1】:

你问了几个问题,当第一次写这个答案时,大多数人的简短回答是:还没有 (虽然我已经更新了它,感谢 DJ房子的answer below!)

应用约束

您应该能够在活动会话期间更改约束,使用 applyConstraints,如下所示:

const videotrack = stream_from_getUserMedia.getVideoTracks()[0];
videotrack.applyConstraints({ frameRate: { max: 10 } });

当今的大多数实现都能够降低帧速率,而不仅仅是提供相机中可用的模式。

试试this fiddle

RTCRtpSender

您应该能够使用setParameters 控制发送者对象中的编码和传输:

const pc = RTCPeerConnection(config);

const videotrack = stream.getVideoTracks()[0];
const sender = pc.addTrack(videotrack, stream);

// get the current parameters first
const params = sender.getParameters();

if (!params.encodings) params.encodings = [{}]; // Firefox workaround!

params.encodings[0].maxBitrate = 60000;
params.encodings[0].scaleResolutionDownBy = 2;
sender.setParameters(params);

encodings 是一个数组,但除非使用联播,否则只有一个条目。

试试this fiddle! (在 Chrome、Firefox、Safari 和 Edge 中测试!)

RTCRtpSender.replaceTrack

您还应该能够在正在进行的对等会话中替换摄像头轨迹,如下所示:

const videotrack2 = a_different_stream.getVideoTracks()[0];
await sender.replaceTrack(videotrack2);

它改变了遥控器看到的东西,而不改变这端的东西。试试this fiddle

【讨论】:

  • 您知道未来的 API 多久会出现吗? 6 个月/1 年?
  • 一些东西现在已经在 Firefox 中实现了,所以我更新了答案以反映这一点。
  • 这似乎不适用于 Safari 移动版 (iOS)。我将 scaleResolutionDownBy 设置为 2 但它只是忽略了它。该代码在 Chrome 桌面上运行,所以它不是代码。
  • Safari 不支持 'scaleResolutionDownBy'
  • @Dachstein 这是我打算为 Safari 链接的 workaround(不支持 scaleResolutionDownBy)。至于表现,你可能是对的,也可能是错的。 MediaStreamTrack 和 RTCRtpSender 只是真正脱离主线程的媒体的浏览器控制对象。我认为浏览器没有理由不能优化源到接收器的媒体路径,无论在哪里声明 JS 缩减。但这并不意味着他们正在这样做,当然。所以最好 1) 让它工作,2) 测量,3) 优化。
【解决方案2】:

对于像我一样(5 年后)最终来到这里的任何人,我需要在设置参数之前获取参数。我假设这是一个老问题,以至于 API 有点过时了。

没有先获取参数,老是报这个错:

Failed to execute 'setParameters' on 'RTCRtpSender': required member codecs is undefined.

这是获取和操作当前参数的快速方法:

var pc = RTCPeerConnection(config);

var videotrack = stream.getVideoTracks()[0];
var sender = pc.addTrack(videotrack, stream);

// get the current parameters first
var params = sender.getParameters();

params.encodings[0].maxBitrate = 60000;
params.encodings[0].scaleResolutionDownBy = 2;

sender.setParameters(params);

这仍然是我快速调试一些 Webrtc 带宽相关问题的好答案。

猜你喜欢
  • 2017-07-21
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多