为什么WebRTC远程视频源是由URL.createObjectURL生成的
Why is WebRTC remote video source generated by URL.createObjectURL
在this document中使用URL.createObjectURL
设置视频源。 (这是接听电话的代码)。
var offer = getOfferFromFriend();
navigator.getUserMedia({video: true}, function(stream) {
pc.onaddstream = e => video.src = URL.createObjectURL(e.stream);
pc.addStream(stream);
pc.setRemoteDescription(new RTCSessionDescription(offer), function() {
pc.createAnswer(function(answer) {
pc.setLocalDescription(answer, function() {
// send the answer to a server to be forwarded back to the caller (you)
}, error);
}, error);
}, error);
});
我希望 video.src 是检索远程视频的地址。所以它应该由连接的另一方(发起呼叫的人)修复并给出。但是 URL.createObjectURL
的值是在应答者一方生成的,它的事件取决于调用函数的时间。如何使用它来获取远程视频流?
编辑:
URL.createObjectURL
的结果看起来像 blob:http://some.site.com/xxxx-the-token-xxxx。有了这个字符串,视频组件如何知道在哪里加载远程流?是否有 {url:stream} 的 hashmap 存储在某处?如果是这样,视频组件如何访问哈希图?
流对象确实存储了一个标记字符串,您可以使用 stream.toURL
获取它。但是和URL.createObjectURL
的结果不一样。 URL.createObjectURL
的值取决于时间。如果你连续调用它两次,你会得到不同的值。
因为 WebRTC 连接涉及多个步骤,并且您从这样的连接中获得的是流。但是video
标签的src
属性不接受一个流,而是一个URL。这是 "convert" 流到 URL.
的方式
URL.createObjectURL(stream)
是一个 hack。停止使用它。正在努力 remove it.
直接使用video.srcObject = stream
。它是标准的 well-implemented.
这种本地资源的分配一开始就不应该是 URL,并且是理解 WebRTC 工作原理的红鲱鱼。
WebRTC 是一种传输方式API,将数据直接从一个点发送到另一个点。不涉及 URL 内容。 onaddstream
得到的远程stream
是一个本地对象接收方,是传输的直播结果,可以播放了。
您阅读的文档陈旧且过时。谢谢指出,我会改正的。它还有其他问题:您应该立即调用 setRemoteDescription ,而不是等待接收者共享他们的相机,否则会错过传入的候选人。而不是你显示的代码,这样做:
pc.onaddstream = e => video.srcObject = e.stream;
function getOfferFromFriend(offer) {
return pc.setRemoteDescription(new RTCSessionDescription(offer))
.then(() => navigator.getUserMedia({video: true}))
.then(stream => {
pc.addStream(stream);
return pc.createAnswer();
})
.then(answer => pc.setLocalDescription(answer))
.then(() => {
// send the answer to a server to be forwarded back to the caller (you)
})
.catch(error);
}
它使用 srcObject
,避免了已弃用的回调 API,并且不会导致间歇性的 ICE 故障。
在this document中使用URL.createObjectURL
设置视频源。 (这是接听电话的代码)。
var offer = getOfferFromFriend();
navigator.getUserMedia({video: true}, function(stream) {
pc.onaddstream = e => video.src = URL.createObjectURL(e.stream);
pc.addStream(stream);
pc.setRemoteDescription(new RTCSessionDescription(offer), function() {
pc.createAnswer(function(answer) {
pc.setLocalDescription(answer, function() {
// send the answer to a server to be forwarded back to the caller (you)
}, error);
}, error);
}, error);
});
我希望 video.src 是检索远程视频的地址。所以它应该由连接的另一方(发起呼叫的人)修复并给出。但是 URL.createObjectURL
的值是在应答者一方生成的,它的事件取决于调用函数的时间。如何使用它来获取远程视频流?
编辑:
URL.createObjectURL
的结果看起来像 blob:http://some.site.com/xxxx-the-token-xxxx。有了这个字符串,视频组件如何知道在哪里加载远程流?是否有 {url:stream} 的 hashmap 存储在某处?如果是这样,视频组件如何访问哈希图?
流对象确实存储了一个标记字符串,您可以使用 stream.toURL
获取它。但是和URL.createObjectURL
的结果不一样。 URL.createObjectURL
的值取决于时间。如果你连续调用它两次,你会得到不同的值。
因为 WebRTC 连接涉及多个步骤,并且您从这样的连接中获得的是流。但是video
标签的src
属性不接受一个流,而是一个URL。这是 "convert" 流到 URL.
URL.createObjectURL(stream)
是一个 hack。停止使用它。正在努力 remove it.
直接使用video.srcObject = stream
。它是标准的 well-implemented.
这种本地资源的分配一开始就不应该是 URL,并且是理解 WebRTC 工作原理的红鲱鱼。
WebRTC 是一种传输方式API,将数据直接从一个点发送到另一个点。不涉及 URL 内容。 onaddstream
得到的远程stream
是一个本地对象接收方,是传输的直播结果,可以播放了。
您阅读的文档陈旧且过时。谢谢指出,我会改正的。它还有其他问题:您应该立即调用 setRemoteDescription ,而不是等待接收者共享他们的相机,否则会错过传入的候选人。而不是你显示的代码,这样做:
pc.onaddstream = e => video.srcObject = e.stream;
function getOfferFromFriend(offer) {
return pc.setRemoteDescription(new RTCSessionDescription(offer))
.then(() => navigator.getUserMedia({video: true}))
.then(stream => {
pc.addStream(stream);
return pc.createAnswer();
})
.then(answer => pc.setLocalDescription(answer))
.then(() => {
// send the answer to a server to be forwarded back to the caller (you)
})
.catch(error);
}
它使用 srcObject
,避免了已弃用的回调 API,并且不会导致间歇性的 ICE 故障。