Javascript 如何在firefox中实现webRTC?
这段代码在google chrome fine中运行, 但我试图将其转换为支持Firefox 我总是在控制台中没有错误。 摄像机好像坏了,但没有录像。 这是剧本Javascript 如何在firefox中实现webRTC?,javascript,node.js,firefox,webrtc,Javascript,Node.js,Firefox,Webrtc,这段代码在google chrome fine中运行, 但我试图将其转换为支持Firefox 我总是在控制台中没有错误。 摄像机好像坏了,但没有录像。 这是剧本 var socket = new WebSocket('ws://127.0.0.1:1338/'); // change the IP address to your websocket server var stunServer = "stun.l.google.com:19302"; var sourcevid =
var socket = new WebSocket('ws://127.0.0.1:1338/'); // change the IP address to your websocket server
var stunServer = "stun.l.google.com:19302";
var sourcevid = document.getElementById('sourcevid');
var remotevid = document.getElementById('remotevid');
var localStream = null;
var remoteStream;
var peerConn = null;
var started = false;
var isRTCPeerConnection = true;
var mediaConstraints = {mandatory: {
OfferToReceiveAudio:true,
OfferToReceiveVideo:true }};
var logg = function(s) { console.log(s); };
// send the message to websocket server
function sendMessage(message) {
var mymsg = JSON.stringify(message);
logg("SEND: " + mymsg);
socket.send(mymsg);
}
function createPeerConnection() {
try {
logg("Creating peer connection");
var servers = [];
servers.push({'url':'stun:' + stunServer});
var pc_config = {'iceServers':servers};
peerConn = new webkitRTCPeerConnection(pc_config);
peerConn.onicecandidate = onIceCandidate;
} catch (e) {
try {
peerConn = new RTCPeerConnection('STUN ' + stunServer, onIceCandidate00);
isRTCPeerConnection = false;
} catch (e) {
logg("Failed to create PeerConnection, exception: " + e.message);
}
}
peerConn.onaddstream = onRemoteStreamAdded;
peerConn.onremovestream = onRemoteStreamRemoved;
}
// when remote adds a stream, hand it on to the local video element
function onRemoteStreamAdded(event) {
logg("Added remote stream");
remotevid.src = window.webkitURL.createObjectURL(event.stream);
}
function waitForRemoteVideo() {
if (remoteStream.videoTracks.length === 0 || remotevid.currentTime > 0) {
transitionToActive();
} else {
setTimeout(waitForRemoteVideo, 100);
}
}
function transitionToActive() {
remotevid.style.opacity = 1;
card.style.webkitTransform = "rotateY(180deg)";
setTimeout(function() { sourcevid.src = ""; }, 500);
setStatus("<input type=\"button\" id=\"hangup\" value=\"Hang up\" onclick=\"onHangup()\" />");
}
// when remote removes a stream, remove it from the local video element
function onRemoteStreamRemoved(event) {
logg("Remove remote stream");
remotevid.src = "";
}
function onIceCandidate(event) {
if (event.candidate) {
sendMessage({type: 'candidate',
label: event.candidate.sdpMLineIndex,
id: event.candidate.sdpMid,
candidate: event.candidate.candidate});
} else {
logg("End of candidates.");
}
}
function onIceCandidate00(candidate, moreToFollow) {
if (candidate) {
sendMessage({type: 'candidate', label: candidate.label, candidate: candidate.toSdp()});
}
if (!moreToFollow) {
logg("End of candidates.");
}
}
// start the connection upon user request
function connect() {
if (!started && localStream) {
console.log("Creating PeerConnection.");
createPeerConnection();
logg('Adding local stream...');
peerConn.addStream(localStream);
started = true;
logg("isRTCPeerConnection: " + isRTCPeerConnection);
//create offer
if (isRTCPeerConnection) {
peerConn.createOffer(setLocalAndSendMessage, null, mediaConstraints);
} else {
var offer = peerConn.createOffer(mediaConstraints);
peerConn.setLocalDescription(peerConn.SDP_OFFER, offer);
sendMessage({type: 'offer', sdp: offer.toSdp()});
peerConn.startIce();
}
} else {
alert("Local stream not running yet.");
}
}
// accept connection request
socket.addEventListener("message", onMessage, false);
function onMessage(evt) {
logg("RECEIVED: " + evt.data);
if (isRTCPeerConnection)
processSignalingMessage(evt.data);
else
processSignalingMessage00(evt.data);
}
function processSignalingMessage(message) {
var msg = JSON.parse(message);
if (msg.type === 'offer') {
if (!started && localStream) {
createPeerConnection();
logg('Adding local stream...');
peerConn.addStream(localStream);
started = true;
logg("isRTCPeerConnection: " + isRTCPeerConnection);
if (isRTCPeerConnection) {
//set remote description
peerConn.setRemoteDescription(new RTCSessionDescription(msg));
//create answer
console.log("Sending answer to peer.");
peerConn.createAnswer(setLocalAndSendMessage, null, mediaConstraints);
} else {
//set remote description
peerConn.setRemoteDescription(peerConn.SDP_OFFER, new SessionDescription(msg.sdp));
//create answer
var offer = peerConn.remoteDescription;
var answer = peerConn.createAnswer(offer.toSdp(), mediaConstraints);
console.log("Sending answer to peer.");
setLocalAndSendMessage00(answer);
}
}
} else if (msg.type === 'answer' && started) {
peerConn.setRemoteDescription(new RTCSessionDescription(msg));
} else if (msg.type === 'candidate' && started) {
var candidate = new RTCIceCandidate({sdpMLineIndex:msg.label, candidate:msg.candidate});
peerConn.addIceCandidate(candidate);
} else if (msg.type == 'chat'){
addChatMsg(msg.nick, msg.cid, msg.data);
}
else if (msg.type === 'bye' && started) {
onRemoteHangUp();
}
}
function processSignalingMessage00(message) {
var msg = JSON.parse(message);
// if (msg.type === 'offer') --> will never happened since isRTCPeerConnection=true initially
if (msg.type === 'answer' && started) {
peerConn.setRemoteDescription(peerConn.SDP_ANSWER, new SessionDescription(msg.sdp));
} else if (msg.type === 'candidate' && started) {
var candidate = new IceCandidate(msg.label, msg.candidate);
peerConn.processIceMessage(candidate);
} else if (msg.type === 'bye' && started) {
onRemoteHangUp();
}
}
function setLocalAndSendMessage(sessionDescription) {
peerConn.setLocalDescription(sessionDescription);
sendMessage(sessionDescription);
}
function setLocalAndSendMessage00(answer) {
peerConn.setLocalDescription(peerConn.SDP_ANSWER, answer);
sendMessage({type: 'answer', sdp: answer.toSdp()});
peerConn.startIce();
}
function onRemoteHangUp() {
logg("Remote Hang up.");
closeSession();
}
function onHangUp() {
logg("Hang up.");
if (started) {
sendMessage({type: 'bye'});
closeSession();
}
}
function closeSession() {
peerConn.close();
peerConn = null;
started = false;
remotevid.src = "";
}
window.onbeforeunload = function() {
if (started) {
sendMessage({type: 'bye'});
}
}
function startVideo() {
// Replace the source of the video element with the stream from the camera
if (navigator.mozGetUserMedia) {
try {
navigator.mozGetUserMedia({audio: true, video: true}, successCallback, errorCallback);
} catch (e) {
navigator.mozGetUserMedia("video,audio", successCallback, errorCallback);
}
}
else {
try {
navigator.webkitGetUserMedia({audio: true, video: true}, successCallback, errorCallback);
} catch (e) {
navigator.webkitGetUserMedia("video,audio", successCallback, errorCallback);
}
}
function successCallback(stream) {
if (navigator.mozGetUserMedia) {
sourcevid.mozSrcObject = stream;
sourcevid.style.webkitTransform = "rotateY(180deg)";
localStream = stream;
}
if(navigator.webkitGetUserMedia){
sourcevid.src = window.webkitURL.createObjectURL(stream);
sourcevid.style.webkitTransform = "rotateY(180deg)";
localStream = stream;
}
}
function errorCallback(error) {
logg('An error occurred: [CODE ' + error.code + ']');
}
}
function stopVideo() {
sourcevid.src = "";
}
var-socket=new-WebSocket('ws://127.0.0.1:1338/');//更改websocket服务器的IP地址
var stunServer=“stun.l.google.com:19302”;
var sourcevid=document.getElementById('sourcevid');
var remotevid=document.getElementById('remotevid');
var localStream=null;
远程流;
var peerConn=null;
var=false;
var isrtpeerconnection=true;
var mediaConstraints={必需:{
OfferToReceiveAudio:正确,
OfferToReceiveVideo:true}};
var logg=函数{console.log;};
//将消息发送到websocket服务器
函数sendMessage(消息){
var mymsg=JSON.stringify(消息);
日志(“发送:+mymsg”);
socket.send(mymsg);
}
函数createPeerConnection(){
试一试{
logg(“创建对等连接”);
var服务器=[];
push({'url':'stun:'+stunServer});
var pc_config={'iceServers':servers};
peerConn=新的WebKitRTPeerConnection(pc_配置);
peerConn.onicecandidate=onicecandidate;
}捕获(e){
试一试{
peerConn=新的RTCPeerConnection('STUN'+stunServer,onIceCandidate00);
isrtpeerconnection=false;
}捕获(e){
logg(“未能创建对等连接,异常:+e.message”);
}
}
peerConn.onaddstream=onRemoteStreamAdded;
peerConn.onremovestream=onRemoteStreamRemoved;
}
//当remote添加流时,将其交给本地视频元素
添加了函数onRemoteStream(事件){
logg(“添加的远程流”);
remotevid.src=window.webkitURL.createObjectURL(event.stream);
}
函数waitForRemoteVideo(){
if(remoteStream.videoTracks.length==0 | | remotevid.currentTime>0){
transitionactive();
}否则{
设置超时(waitForRemoteVideo,100);
}
}
函数transitionactive(){
remotevid.style.opacity=1;
card.style.webkitttransform=“旋转(180度)”;
setTimeout(函数(){sourcevid.src=”“;},500);
设置状态(“”);
}
//远程删除流时,请将其从本地视频元素中删除
函数onRemoteStreamRemoved(事件){
logg(“删除远程流”);
remotevid.src=“”;
}
函数onIceCandidate(事件){
if(事件候选){
sendMessage({type:'candidate',
标签:event.candidate.sdpMLineIndex,
id:event.candidate.sdpMid,
候选:event.candidate.candidate});
}否则{
logg(“候选人结束”);
}
}
函数onIceCandidate00(候选函数,更多如下){
如果(候选人){
sendMessage({type:'candidate',label:candidate.label,candidate:candidate.toSdp()});
}
如果(!moretfollow){
logg(“候选人结束”);
}
}
//根据用户请求启动连接
函数连接(){
如果(!started&&localStream){
log(“创建对等连接”);
createPeerConnection();
logg('添加本地流…');
peerConn.addStream(localStream);
开始=真;
日志(“ISRTPEERCONNECTION:+ISRTPEERCONNECTION”);
//创建报价
if(ISRTPeerConnection){
createOffer(setLocalAndSendMessage,null,mediaConstraints);
}否则{
var offer=peerConn.createOffer(mediaConstraints);
peerConn.setLocalDescription(peerConn.SDP_OFFER,OFFER);
sendMessage({type:'offer',sdp:offer.toSdp()});
peerConn.startIce();
}
}否则{
警报(“本地流尚未运行”);
}
}
//接受连接请求
addEventListener(“message”,onMessage,false);
消息函数(evt){
日志(“收到:+evt.数据”);
if(ISRTPeerConnection)
处理信号消息(evt.data);
其他的
ProcessingSignalingMessage00(evt.data);
}
函数processSignalingMessage(消息){
var msg=JSON.parse(消息);
如果(msg.type==='offer'){
如果(!started&&localStream){
createPeerConnection();
logg('添加本地流…');
peerConn.addStream(localStream);
开始=真;
日志(“ISRTPEERCONNECTION:+ISRTPEERCONNECTION”);
if(ISRTPeerConnection){
//设置远程描述
setRemoteDescription(新的RTCSessionDescription(msg));
//创建答案
log(“向对等方发送应答”);
createAnswer(setLocalAndSendMessage,null,mediaConstraints);
}否则{
//设置远程描述
peerConn.setRemoteDescription(peerConn.SDP_OFFER,新SessionDescription(msg.SDP));
//创建答案
var offer=peerConn.remoteDescription;
var answer=peerConn.createAnswer(offer.toSdp(),mediaConstraints);
log(“向对等方发送应答”);
setLocalAndSendMessage00(应答);
}
}
}else if(msg.type==='answer'&&started){
setRemoteDescription(新的RTCSessionDescription(msg));
}else if(msg.type=='candidate'&&started){
var-candidate=new-RTCIceCandidate({sdpMLineIndex:msg.label,candidate:msg.candidate});
peerConn.addIceCandidate(候选);
}else if(msg.type=='chat'){
addChatMsg(msg.nick、msg.cid、msg.data);
}
else if(msg.type==='bye'&&started){
onRemoteHangUp();
}
}
函数processSignalingMessage00(消息){
var msg=JSON.parse(消息);
//如果(msg.type=='offer')-->将永远不会发生,因为最初isrtpeerconnection=true
if(msg.type==='answer'&&started){
peerConn.setRemoteDescription(peerConn.SDP_答案,新会话描述(msg.SDP));
}else if(msg.type=
<script type="text/javascript" src="{{ asset('bundles/PFESiivt/js/visio.js') }}"></script>
<div id="main">
<div id="" style="height:280px;width:700;">
<div id="livevideodivk" style="float:left;">
<video id="sourcevid" style="height:280px;width:320px;" autoplay></video>
</div>
<div id="remotevideodivk" style="float:left;margin-left:10px">
<video id="remotevid" style="height:280px;width:320px;" autoplay></video>
</div>
</div>
<center>
<button id="btn" type="button" onclick="startVideo();">Start video</button>
<button id="btn" type="button" onclick="stopVideo();">Stop video</button>
<button id="btn" type="button" onclick="connect();">Connect</button>
<button id="btn" type="button" onclick="onHangUp();">Hang Up</button>
</center>
</div>