- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
来自 Mozilla 网站:https://developer.mozilla.org/en-US/docs/Web/API/Media_Streams_API
“一个 MediaStream 由零个或多个 MediaStreamTrack 对象组成,代表各种音频或视频轨道。每个 MediaStreamTrack 可能有一个或多个 channel 。 channel 代表媒体流的最小单元,例如与给定关联的音频信号扬声器,如立体声音轨中的左或右。”
这阐明了什么是 channel 。
几个最近的 RFC(例如 8108)提到需要在一个 RTP session 中发送多个流。每个流在 RTP 级别都有自己的 SSRC。在统一计划的 RFC 中,引用始终是最低级别的流(不是轨道或 channel )。在 RFC 3550 中,基本 RTP RFC,没有对 channel 的引用。
这些 RFC 中提到的 RTP 流是否表明流是媒体的最低来源,与 WebRTC 中使用的 channel 相同,如上文所述?轨道 channel (WebRTC) 和带有 SSRC 的 RTP 流之间是否存在一对一映射?
例如,网络摄像头生成一个媒体流,它可以有一个音频媒体轨道和一个视频媒体轨道,每个轨道使用单独的 SSRC 在 RTP 数据包中传输,从而产生两个 SSRC。那是对的吗?现在如果有一个立体声网络摄像头(或者一些类似的设备,比如说两个麦克风 - channel ?)。这会生成具有三个不同的唯一 SSRC 的三个 RTP 流吗?
在成功测试 ICE 候选人后,是否有针对五元组连接建立的单个 RTP session ?或者在对等点之间的同一组 port-ip-UDP 连接上可以有多个 RTP session 吗?
任何澄清这一点的文件将不胜感激。
最佳答案
That clarifies what a channel is.
不完全是。只有音频 轨道有 channel 。除非你使用 web audio至 split up将音频 MediaStreamTrack
放入单独的 channel ,轨道是关于对等连接的最低级别。 *
这是因为多个音频 channel ,就像视频的多个帧一样,是有效载荷的一部分,由编解码器编码和解码。实际上,您可以在接收器的 MedaiStreamTrack 上使用网络音频分离器来分离音频 channel ,前提是它们幸存下来。
*) 还有 data channels , 但它们是不同的,与媒体流和轨道无关。
Is the RTP stream ... the same as channels as that term is used in WebRTC, and as referenced above?
没有。粗略地说,你可以说:
但这还不是全部,因为 sender.replaceTrack(withTrack)
.简而言之,您可以随时在实时通话期间将正在发送的轨道替换为不同的轨道,而无需重新协商您的连接。重要的是,在这种情况下,另一方的 receiver.track
不会改变,只有它的输出会改变。这将管道与通过它的内容分开。
所以在发送方,更公平地说:
pc.getSenders()
)...而在接收方,它更简单,而且总是正确地说:
有道理吗?
在modern WebRTC , MediaStream
是哑容器——您可以使用 stream.addTrack(track)
和 stream.removeTrack(track)< 随意添加或删除轨道
—此外,RTCPeerConnection
仅处理tracks。例如:
for (const track of stream.getTracks()) {
pc.addTrack(track, stream);
}
Is there a one-to-one mapping between
channels ofa track and RTP stream with a SSRC?
在 MediaStreamTrack
和 SSRC 之间,是的。
A webcam, [...] can have a audio media track and a video media track, each track is transported in RTP packets using a separate SSRC, resulting in two SSRCs. Is that correct?
在这种情况下是的,因为音频永远不能与视频捆绑,反之亦然。
Now what if there is a stereo webcam
没有区别。立体声音轨仍然是单个音轨(和单个 RTP 流)。
Or can there be multiple RTP sessions over the same set of port-ip-UDP connection between peers?
不是同时。但是多个轨道可以共享同一个 session ,除非你使用非默认:
new RTCPeerConnection({bundlePolicy: 'max-compat'});
如果你不这样做,或者使用 any other mode , 然后可以将同类轨道捆绑到单个 RTP session 中。
关于javascript - WebRTC: channel 、轨道和流与 RTP SSRC 和 RTP session 之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53673672/
这个问题在这里已经有了答案: Why filter() after flatMap() is "not completely" lazy in Java streams? (8 个答案) 关闭 6
我正在创建一个应用程序来从 Instagram 收集数据。我正在寻找像 Twitter 流 API 这样的流 API,这样我就可以自动实时收集数据而无需发送请求。 Instagram 有类似的 API
我正在使用 Apache Commons 在 Google App Engine 中上传一个 .docx 文件,如此链接中所述 File upload servlet .上传时,我还想使用 Apach
我尝试使用 DynamoDB 流和 AWS 提供的 Java DynamoDB 流 Kinesis 适配器捕获 DynamoDB 表更改。我正在 Scala 应用程序中使用 AWS Java 开发工具
我目前有一个采用 H.264 编码的 IP 摄像机流式视频 (RTSP)。 我想使用 FFmpeg 将此 H.264 编码流转换为另一个 RTSP 流,但 MPEG-2 编码。我该怎么做?我应该使用哪
Redis 流是否受益于集群模式?假设您有 10 个流,它们是分布在整个集群中还是都分布在同一节点上?我计划使用 Redis 流来实现真正的高吞吐量(200 万条消息/秒),所以我担心这种规模的 Re
这件事困扰了我一段时间。 所以我有一个 Product 类,它有一个 Image 列表(该列表可能为空)。 我想做 product.getImages().stream().filter(...) 但
是否可以使用 具有持久存储的 Redis 流 还是流仅限于内存数据? 我知道可以将 Redis 与核心数据结构的持久存储一起使用,但我已经能够理解是否也可以使用 Redis 中的流的持久存储。 最佳答
我开始学习 Elixir 并遇到了一个我无法轻松解决的挑战。 我正在尝试创建一个函数,该函数接受一个 Enumerable.t 并返回另一个 Enumerable.t ,其中包含下 n 个项目。它与
我试图从 readLine 调用创建一个无限的字符串流: import java.io.{BufferedReader, InputStreamReader} val in = new Buffere
你能帮我使用 Java 8 流 API 编写以下代码吗? SuperUser superUser = db.getSuperUser; for (final Client client : super
我正在尝试服用补品routeguide tutorial,并将客户端变成rocket服务器。我只是接受响应并将gRPC转换为字符串。 service RouteGuide { rpc GetF
流程代码可以是run here. 使用 flow,我有一个函数,它接受一个键值对对象并获取它的值 - 它获取的值应该是字符串、数字或 bool 值。 type ValueType = string
如果我有一个函数返回一个包含数据库信息的对象或一个空对象,如下所示: getThingFromDB: async function(id:string):Promise{ const from
我正在尝试使用javascript api和FB.ui将ogg音频文件发布到流中, 但是我不知道该怎么做。 这是我给FB.ui的电话: FB.ui( { method: '
我正在尝试删除工作区(或克隆它以使其看起来像父工作区,但我似乎两者都做不到)。但是,当我尝试时,我收到此消息:无法删除工作区 test_workspace,因为它有一个非空的默认组。 据我所知,这意味
可以使用 Stream|Map 来完成此操作,这样我就不需要将结果放入外部 HashMap 中,而是使用 .collect(Collectors.toMap(...)); 收集结果? Map rep
当我们从集合列表中获取 Stream 时,幕后到底发生了什么?我发现很多博客都说Stream不存储任何数据。如果这是真的,请考虑代码片段: List list = new ArrayList(); l
我对流及其工作方式不熟悉,我正在尝试获取列表中添加的特定对象的出现次数。 我找到了一种使用Collections来做到这一点的方法。其过程如下: for (int i = 0; i p.conten
我希望将一个 map 列表转换为另一个分组的 map 列表。 所以我有以下 map 列表 - List [{ "accId":"1", "accName":"TestAcc1", "accNumber
我是一名优秀的程序员,十分优秀!