- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试设置一个基本的视频聊天示例。目前正在尝试在同一台计算机上的两个 Chrome 选项卡之间聊天。
一切看起来都很好,直到我获得远程视频流,当我使用 URL.createObjectURI
将其放入 remoteVideo
元素时,我什么也没有得到。尽管我收到了远程流事件,但没有视频显示。
什么会导致这种情况?有任何想法吗?请帮忙!
这是信号日志:
调用者:
Got userMedia
Registered signaling room
BY_WebRTC.startSession HOQfXIe3uoLMtDgSlHVH+A== true
VM9840:128 tryStart: created peer connection.
VM9840:150 Created RTCPeerConnnection
VM9840:133 tryStart: added stream to peer connection.
VM9840:170 Sending offer to peer
VM9840:184 sending sdp RTCSessionDescription {type: "offer", sdp: "v=0
↵o=- 3416476007859143551 2 IN IP4 127.0.0.1
↵s…9521 label:a8a8592f-d78d-40b2-bc1c-1a7c33772201
↵"}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:3054232416 1 udp 2122260223 169.254.80.8… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 2", sdpMid: "audio", sdpMLineIndex: 0}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:3708192848 1 udp 2122194687 172.19.67.39… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 1", sdpMid: "audio", sdpMLineIndex: 0}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:3054232416 2 udp 2122260222 169.254.80.8… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 2", sdpMid: "audio", sdpMLineIndex: 0}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:3708192848 2 udp 2122194686 172.19.67.39… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 1", sdpMid: "audio", sdpMLineIndex: 0}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:3054232416 1 udp 2122260223 169.254.80.8… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 2", sdpMid: "video", sdpMLineIndex: 1}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:3708192848 1 udp 2122194687 172.19.67.39… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 1", sdpMid: "video", sdpMLineIndex: 1}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:3054232416 2 udp 2122260222 169.254.80.8… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 2", sdpMid: "video", sdpMLineIndex: 1}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:3708192848 2 udp 2122194686 172.19.67.39… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 1", sdpMid: "video", sdpMLineIndex: 1}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:4169670544 1 tcp 1518280447 169.254.80.8… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 2", sdpMid: "audio", sdpMLineIndex: 0}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:2474996896 1 tcp 1518214911 172.19.67.39… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 1", sdpMid: "audio", sdpMLineIndex: 0}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:4169670544 2 tcp 1518280446 169.254.80.8… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 2", sdpMid: "audio", sdpMLineIndex: 0}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:2474996896 2 tcp 1518214910 172.19.67.39… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 1", sdpMid: "audio", sdpMLineIndex: 0}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:4169670544 1 tcp 1518280447 169.254.80.8… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 2", sdpMid: "video", sdpMLineIndex: 1}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:2474996896 1 tcp 1518214911 172.19.67.39… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 1", sdpMid: "video", sdpMLineIndex: 1}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:4169670544 2 tcp 1518280446 169.254.80.8… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 2", sdpMid: "video", sdpMLineIndex: 1}
VM9840:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:2474996896 2 tcp 1518214910 172.19.67.39… generation 0 ufrag Ab1ql0yuiJZgNzDJ network-id 1", sdpMid: "video", sdpMLineIndex: 1}
VM9840:110 Received answer
VM9840:207 Remote stream added. MediaStreamEvent {stream: MediaStream, type: "addstream", target: RTCPeerConnection, currentTarget: RTCPeerConnection, eventPhase: 2…}
VM9840:191 handleIceCandidate event: null
VM9840:202 End of candidates.
被调用者:
Got User Media
Registered signaling room
Received offer
webrtc.js?v=2.22:128 tryStart: created peer connection.
webrtc.js?v=2.22:150 Created RTCPeerConnnection
webrtc.js?v=2.22:133 tryStart: added stream to peer connection.
webrtc.js?v=2.22:175 Sending answer to peer.
webrtc.js?v=2.22:207 Remote stream added. MediaStreamEvent {stream: MediaStream, type: "addstream", target: RTCPeerConnection, currentTarget: RTCPeerConnection, eventPhase: 2…}
webrtc.js?v=2.22:184 sending sdp RTCSessionDescription {type: "answer", sdp: "v=0
↵o=- 1405083852183288173 2 IN IP4 127.0.0.1
↵s…5319 label:9a0427e6-be00-4a66-a862-77c1deafb89d
↵"}
webrtc.js?v=2.22:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:3054232416 1 udp 2122260223 169.254.80.8… generation 0 ufrag wf8+wbbJ2eepjam8 network-id 2", sdpMid: "audio", sdpMLineIndex: 0}
webrtc.js?v=2.22:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:3708192848 1 udp 2122194687 172.19.67.39… generation 0 ufrag wf8+wbbJ2eepjam8 network-id 1", sdpMid: "audio", sdpMLineIndex: 0}
webrtc.js?v=2.22:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:4169670544 1 tcp 1518280447 169.254.80.8… generation 0 ufrag wf8+wbbJ2eepjam8 network-id 2", sdpMid: "audio", sdpMLineIndex: 0}
webrtc.js?v=2.22:191 handleIceCandidate event: RTCIceCandidate {candidate: "candidate:2474996896 1 tcp 1518214911 172.19.67.39… generation 0 ufrag wf8+wbbJ2eepjam8 network-id 1", sdpMid: "audio", sdpMLineIndex: 0}
webrtc.js?v=2.22:191 handleIceCandidate event: null
webrtc.js?v=2.22:202 End of candidates.
代码(在调用者的 startSession 处以 isInitiator=true 开始 - 获取本地媒体后):
var BY_WebRTC = {
// consts
pc_config: {
'iceServers': [
{ url: 'stun:stun1.l.google.com:19302' }]
},
pc_constraints: { 'optional': [{ 'DtlsSrtpKeyAgreement': true }] },
sdpConstraints: {
'mandatory': {
// Set up audio and video regardless of what devices are present.
'OfferToReceiveAudio': true,
'OfferToReceiveVideo': true
}
},
localStream: null,
remoteStream: null,
isStarted: false,
isInitiator: false,
realtimeEventId: null, // current conversation object realtime server room id
pc: null, // peer connection
getUserMedia: function (video, audio, callback) {
var constraints = { video: video, audio: audio };
navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
BY_WebRTC.localStream = stream;
callback(stream);
}).catch(function (error) {
console.log("BY_WebRTC:getUserMedia Error!", error);
});
},
startSession: function (encryptedObjectId, isInitiator) {
// store the realtime event id
BY_WebRTC.realtimeEventId = { groupType: 'object', groupId: encryptedObjectId, eventType: "webrtc" };
BY_WebRTC.encryptedObjectId = encryptedObjectId;
// register chat room for webrtc signaling
nowManager.registerGroupEvents([BY_WebRTC.realtimeEventId], BY_WebRTC.realtimeWebRTC_EventHandler);
console.log("BY_WebRTC.startSession", encryptedObjectId, isInitiator);
if (isInitiator) {
BY_WebRTC.isInitiator = true;
BY_WebRTC.tryStart();
}
},
realtimeWebRTC_EventHandler: function (message) {
if (message === 'start') {
BY_WebRTC.tryStart();
}
else if (message.type === 'offer') {
console.log('Received offer');
if (!BY_WebRTC.isInitiator && !BY_WebRTC.isStarted) {
BY_WebRTC.tryStart();
}
BY_WebRTC.pc.setRemoteDescription(new RTCSessionDescription(message));
BY_WebRTC.sendAnswer();
}
else if (message.type === 'answer' && isStarted) {
console.log('Received answer');
BY_WebRTC.pc.setRemoteDescription(new RTCSessionDescription(message));
}
else if (message.type === 'candidate' && BY_WebRTC.isStarted) {
var candidate = new RTCIceCandidate({
sdpMLineIndex: message.label,
candidate: message.candidate
});
BY_WebRTC.pc.addIceCandidate(candidate);
}
else if (message === 'bye' && BY_WebRTC.isStarted) {
BY_WebRTC.handleRemoteHangup();
}
},
tryStart: function () {
if (!BY_WebRTC.isStarted && typeof BY_WebRTC.localStream != null) {
console.log("tryStart: created peer connection.");
BY_WebRTC.createPeerConnection();
BY_WebRTC.pc.addStream(BY_WebRTC.localStream);
console.log("tryStart: added stream to peer connection.");
isStarted = true;
if (BY_WebRTC.isInitiator) {
BY_WebRTC.sendOffer();
}
}
},
createPeerConnection: function () {
try {
var pc = new RTCPeerConnection(this.pc_config);
pc.onicecandidate = this.handleIceCandidate;
pc.onaddstream = this.handleRemoteStreamAdded;
pc.onremovestream = this.handleRemoteStreamRemoved;
console.log('Created RTCPeerConnnection');
BY_WebRTC.pc = pc;
} catch (e) {
console.log('Failed to create PeerConnection, exception: ' + e.message);
alert('Cannot create RTCPeerConnection object.');
return;
}
},
handleCreateOfferError: function (event) {
console.log('sendOffer() error: ', e);
},
handleSendAnswerError: function (event) {
console.log('sendAnswer() error: ', e);
},
sendOffer: function () {
console.log('Sending offer to peer');
BY_WebRTC.pc.createOffer(BY_WebRTC.setLocalAndSendMessage, BY_WebRTC.handleCreateOfferError);
},
sendAnswer: function () {
console.log('Sending answer to peer.');
BY_WebRTC.pc.createAnswer(BY_WebRTC.setLocalAndSendMessage, BY_WebRTC.handleSendAnswerError, BY_WebRTC.sdpConstraints);
},
setLocalAndSendMessage: function (sessionDescription) {
// Set Opus as the preferred codec in SDP if Opus is present.
sessionDescription.sdp = BY_WebRTC.preferOpus(sessionDescription.sdp);
BY_WebRTC.pc.setLocalDescription(sessionDescription);
console.log("sending sdp", sessionDescription);
nowManager.sendGroupEvent(BY_WebRTC.realtimeEventId, sessionDescription);
},
handleIceCandidate: function (event) {
console.log('handleIceCandidate event: ', event.candidate);
if (event.candidate) {
nowManager.sendGroupEvent(BY_WebRTC.realtimeEventId, {
type: 'candidate',
label: event.candidate.sdpMLineIndex,
id: event.candidate.sdpMid,
candidate: event.candidate.candidate
});
}
else {
console.log('End of candidates.');
}
},
handleRemoteStreamAdded: function (event) {
console.log('Remote stream added.', event);
// todo: send callback event after got remote stream
document.querySelector('#remoteVideo').src = window.URL.createObjectURL(event.stream);
BY_WebRTC.remoteStream = event.stream;
$("#remoteVideo").show();
},
handleRemoteStreamRemoved: function (event) {
console.log('Remote stream removed. Event: ', event);
},
hangup: function () {
console.log('Hanging up.');
this.stop();
nowManager.sendGroupEvent(this.realtimeEventId, "bye");
},
handleRemoteHangup: function () {
// console.log('Session terminated.');
// stop();
// isInitiator = false;
},
stop: function () {
BY_WebRTC.isStarted = false;
BY_WebRTC.pc.close();
BY_WebRTC.pc = null;
}
}
最佳答案
好的,我找到了答案!由于一些小错误(我没有 init isStarted = true ),我没有添加冰候选者。这是导致问题的原因。
关于javascript - webrtc pc.onaddstream window.URL.createObjectURl 远程视频未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38424014/
我的 PC 上有一个服务器应用程序,它读取 jpg 文件并通过套接字将其发送到 Android 设备。问题是,当Android设备接收到字节数组时,无法将其转换为位图。我创建了一个 PC 应用程序来接
我创建了一个 JavaFX 应用程序。现在我想确保它不被复制到其他计算机上。更详细地说,我将该应用程序出售给一位客户,安装该应用程序后,我需要确保其不被从一台计算机复制到另一台计算机。 如何防止他人复
我构建了一个使用 Dynamic 关键字的程序。 在我的代码中,我这样做了: public void OnNext(ExpandoObject value) { dynamic expando
如何通过USB在两台PC之间进行通信?我想要一个程序通过 USB 端口将数字发送到另一台 PC,另一个程序将在该 PC 上显示这些数字。我觉得这是不可能的,因为 PC 是主机而不是设备,但 USB 真
我的代码在 virtualbox 中完美运行,但在真实 PC 上启动时却无法运行(从 BIOS 检测为 USB 硬盘驱动器的 USB 笔驱动器)。 在虚拟框中;该代码将磁盘的第 2 和第 3 扇区读取
在开发 PC HD 损坏后,我正在考虑让我的开发环境完全基于虚拟 PC。 核心项目是:- XP Pro 32- IIS- VS2003- VS2008- SQL Server 2005- Office
我目前使用的是 Windows Server 2008 Standard 并且有几台 Hyper V 机器。这些是开发 VM,我现在想切换回 Vista x64,因为我缺少 Aero。 我知道 Win
我使用 Virtual PC 来创建新的环境来测试我的安装程序。但我一定是做错了什么,因为内部装有 Vista 或 XP 的 VPC 镜像占用了大约 15GB 的磁盘空间(包括安装在其中的 VS200
大家好,我正在调试一些 CS 程序,为了查看应用程序在慢速互联网中的性能,我尝试了很多不同的方法。然而最好的是服务器端和客户端在同一台电脑上——我的服务器端和客户端的调试环境是在一台电脑上设置的。 所
我有兴趣制作一个将字符串从一台计算机传输到另一台计算机的应用程序。我对 TCP 或 UDP 通信感兴趣。我已经实现了 UDP,但它似乎能够发送最多 512 字节的数据/数据包。在两端实现数据包拆分和连
在为 Pocket PC 平台开发软件时,我一直很高兴地使用 Microsoft 随 Visual Studio 提供的 Pocket PC 模拟器(并且可以免费下载)。它提供了更快的开发/部署/测试
我想执行一个批处理文件 D:\apache-tomcat-6.0.20\apache-tomcat-7.0.30\bin\shutdown.bat 这是在我的服务器上 inidsoasrv01 . 我
我目前正在我的开发 PC 上使用 Jenkins。我把它安装在我的开发电脑上,因为我对这个工具的了解有限;所以我在我的开发电脑上对其进行了测试。现在,我对 Jenkins 作为我在构建过程中的长期“合
互联网上有很多示例展示了如何编写一个应用程序,使我们能够通过蓝牙与手机与电脑进行通信。但我想做的是通过蓝牙从另一台电脑控制一台电脑。我正在尝试使用蓝牙库。我在一台电脑上运行服务器,并尝试使用此处的示例
我正在寻找一个基准测试(以及在其他 PC 上的结果),它可以让我了解通过升级我的 PC 可以获得的开发性能提升,而且该基准测试可以用来向我的老板证明升级的合理性。 我使用 Visual Studio
我只在一台 PC 上有异常,在其他 PC 上一切正常,有人知道它是从哪里来的吗? dditional information: Requested Windows Runtime type 'Wind
我想创建一个软件,它可以使用 session 选项进行 pc 到 pc 调用(没有电话)。所有参与者将仅使用该软件。我擅长使用不同的语言、平台和数据库进行编程。但是我以前没有做过这种类型的软件。 我将
我做了这个布局。 template 唯一的问题是宽度问题。它因显示器而异,取决于显示器的宽度。主菜单和标题区域的左右两侧都有空白区域。在页脚的情况下你可以看到同样的情况.. 根据我的显示器宽度,我有
我在我的电脑上编译了一个内核,然后我把它安装在同一台电脑上,它工作正常。我的问题是如何在另一台计算机上安装相同的内核? 最佳答案 您需要复制 vmlinuz-[version number] 和 in
我正在使用 Mysql,我在两个不同的系统中有两个数据库。我希望我的本地数据库与远程数据库同步。这两个架构将具有相同的表和列。 每当远程数据库发生变化时,我的本地数据库中应该发生变化/更新。 怎么做?
我是一名优秀的程序员,十分优秀!