mirror of
https://github.com/SrIzan10/vdo.ninja.git
synced 2026-05-01 11:05:24 +00:00
Compare commits
79 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b270267ec9 | ||
|
|
52ab49158e | ||
|
|
de23614d69 | ||
|
|
308e81cf12 | ||
|
|
1b9723ebd6 | ||
|
|
523863f29d | ||
|
|
d6f35092f1 | ||
|
|
031fab960a | ||
|
|
34a6bb49d0 | ||
|
|
059a575b33 | ||
|
|
7a51c5a826 | ||
|
|
02c93549d6 | ||
|
|
fb10013ca2 | ||
|
|
5cf966b0e8 | ||
|
|
b40e743253 | ||
|
|
1cfadb29e2 | ||
|
|
a787a78892 | ||
|
|
9cd7b23436 | ||
|
|
afc6e4f059 | ||
|
|
df6c147311 | ||
|
|
0d1606833d | ||
|
|
b8cfecb108 | ||
|
|
31b9df5a06 | ||
|
|
905c39a58b | ||
|
|
d52fb0905e | ||
|
|
6d19c082f4 | ||
|
|
bae12cbf73 | ||
|
|
a0031fff0c | ||
|
|
5115ae7735 | ||
|
|
a1aab474fa | ||
|
|
17c2ae5fc6 | ||
|
|
268460dcd5 | ||
|
|
e7ba4f9e8d | ||
|
|
214c8d2a76 | ||
|
|
c2fea315a6 | ||
|
|
da2b18f642 | ||
|
|
c310afa1f7 | ||
|
|
c801ceb19a | ||
|
|
b0231f4e00 | ||
|
|
aa24a4be94 | ||
|
|
d20aa3cd43 | ||
|
|
3b411091d4 | ||
|
|
bf9e520f1c | ||
|
|
fb8271142b | ||
|
|
680535412e | ||
|
|
c23aaced01 | ||
|
|
d4f29c6491 | ||
|
|
05082022cd | ||
|
|
d2d9e4918d | ||
|
|
f1f146a8a5 | ||
|
|
0c60f1fdd6 | ||
|
|
daa39963e8 | ||
|
|
5e5c1592bf | ||
|
|
f3b7e86095 | ||
|
|
eeaace7788 | ||
|
|
5868223c35 | ||
|
|
6be0fcf79b | ||
|
|
a9ca78ee2a | ||
|
|
2a481a8dbe | ||
|
|
472a83870a | ||
|
|
7e839a0a5b | ||
|
|
61533e8c9e | ||
|
|
c618b91aa5 | ||
|
|
c15f33934b | ||
|
|
1df852448b | ||
|
|
fb9bfcc12b | ||
|
|
af516397d8 | ||
|
|
b43a21e860 | ||
|
|
4dbb6613ef | ||
|
|
d33f5bef4c | ||
|
|
5eefa9021d | ||
|
|
05b021e18c | ||
|
|
c7bbfc4b15 | ||
|
|
235908d0e6 | ||
|
|
9ad233cfa9 | ||
|
|
7425fceeec | ||
|
|
2caf55089f | ||
|
|
b31248c191 | ||
|
|
3215094833 |
11
README.md
11
README.md
@@ -19,14 +19,16 @@ MacOS users will face some challenges in using OBS currently, but there are work
|
||||
This repo contains software for OBS.Ninja, including the HTML landing page for its Electron Capture app offering. A sample config file and instructions for setting up a TURN server (video relay server), is also provided. You may also find the Wiki for the project in this repo, which contains added information on how to use the software.
|
||||
|
||||
## How to Deploy this Repo:
|
||||
To use, just download and host on a HTTPS-enabled webserver. You may want to hide the .html extensions within your HTTP server as well, else the generated links will not work.
|
||||
To use, just download and host the files on a HTTPS-enabled webserver. You may want to hide the .html extensions within your HTTP server as well, else the generated links will not work. See [here](https://github.com/steveseguin/obsninja/blob/master/install.md) for added details, although I don't really recommend it.
|
||||
|
||||
Directions on how to deploy a TURN server are listed in the turnserver.conf file. You may wish to do so if you are having problems with my existing TURN server, although most users will not need one. About 10% of users, those often connected via 4G LTE, will require a TURN server.
|
||||
Directions on how to deploy a TURN server are listed in the turnserver.md file. You may wish to do so, although not all use cases will not need one. About 10% of remote guests, those often connected via 4G LTE, will require a TURN server however. While OBS.Ninja does host some TURN servers, they are quite expensive to operate and not really for private deployment use. If you are deploying your own version of OBS.Ninja, I'd ask you use your own TURN servers instead.
|
||||
|
||||
## Server side / API software?
|
||||
Since OBS.Ninja uses peer-2-peer technology, video connections are made directly between viewer and publisher in 90% of cases. Hosting a TURN server yourself may help improve performance, but less than 1% of users will see any benefit of this. Details on how to deploy a TURN server are provided. For those capable of hosting their own TURN server, that would be appreciated if possible, as TURN servers are the only real cost incurred by OBS.Ninja at present. (other than time, of course)
|
||||
|
||||
Other than TURN servers, OBS.Ninja also uses public STUN servers and a hosted handshake server. These are used to facilitate the initial setup of peer connections and are generally not required after a peer connection is established. Development builds of OBS.Ninja may include debugging software, but in-production releases have this removed.
|
||||
Other than TURN servers, OBS.Ninja also uses public STUN servers and a hosted handshake server. These are used to facilitate the initial setup of peer connections and are generally not required after a peer connection is established. These servers are free to access and use, even for private deployments.
|
||||
|
||||
Development builds of OBS.Ninja may include debugging software, but in-production releases have this removed. Double check to ensure "console.re" debugging is disabled before deployment, just to be safe.
|
||||
|
||||
A design goal of OBS.Ninja is to be serverless and we are 99% of the way there. This design objective ensures OBS.Ninja can be offered for free, along with providing increased levels of security and privacy.
|
||||
|
||||
@@ -51,7 +53,7 @@ https://steves.app/
|
||||
A browser-based studio solution and simplified alternative to OBS, with built-in OBS.Ninja functionality. It is a server-based approach to group interactions and live production. Steve Seguin is affiliated with StageTen, yet StageTen is not affiliated with OBS.Ninja.
|
||||
|
||||
## Privacy
|
||||
I try to avoid data collection whenever possible and video streams are generally designed to be private, but use at your own risk. It is best to not share links created with OBS.Ninja with those you do not trust. I've provided instructions on how to deploy a TURN server if IP-address privacy is an issue for you. See: turnserver.conf
|
||||
I try to avoid data collection whenever possible and video streams are generally designed to be private, but use at your own risk. It is best to not share links created with OBS.Ninja with those you do not trust. I've provided instructions on how to deploy a TURN server if IP-address privacy is an issue for you. See: turnserver.md
|
||||
|
||||
https://obs.ninja may unavoidably use cookies that are exempt from EU laws of requiring notice of their use; they are exempt as they are required and necessary for the technical functioning of the web service. Our webserver is cached by Cloudflare and it provides denial of server protection for the users of OBS.Ninja.
|
||||
|
||||
@@ -62,4 +64,3 @@ Ideas, feedback, bugs, etc -- all welcomed. I'm dumping many of my ideas as iss
|
||||
|
||||
## Licence
|
||||
OBS.Ninja is available as open-source; please see the LICENCE.md file for details.
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
html {
|
||||
border:0;
|
||||
margin:0;
|
||||
outline:0;
|
||||
|
||||
}
|
||||
|
||||
video {
|
||||
@@ -28,8 +30,18 @@ body {
|
||||
flex-flow: column;
|
||||
border:0;
|
||||
margin:0;
|
||||
|
||||
outline:0;
|
||||
}
|
||||
|
||||
button.glyphicon-button:focus,
|
||||
button.glyphicon-button:active:focus,
|
||||
button.glyphicon-button.active:focus,
|
||||
button.glyphicon-button.focus,
|
||||
button.glyphicon-button:active.focus,
|
||||
button.glyphicon-button.active.focus {
|
||||
outline: none !important;
|
||||
}
|
||||
|
||||
button{
|
||||
padding:10px;
|
||||
font-size: 20px;
|
||||
@@ -71,6 +83,31 @@ input[type='checkbox'] {
|
||||
input[type='checkbox']:checked {
|
||||
background: #1A1;
|
||||
}
|
||||
#audioOutput{
|
||||
font-size: calc(16px + 0.3vw);
|
||||
max-width:590px
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1030px) {
|
||||
body{
|
||||
zoom: 0.9;
|
||||
-moz-transform: scale(0.9);
|
||||
-moz-transform-origin: 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 940px) {
|
||||
body{
|
||||
zoom: 0.64;
|
||||
-moz-transform: scale(0.64);
|
||||
-moz-transform-origin: 0 0;
|
||||
|
||||
}
|
||||
#audioOutput{
|
||||
font-size: calc(14px + 1.4vw);
|
||||
max-width:486px
|
||||
}
|
||||
}
|
||||
</style></head>
|
||||
<body >
|
||||
|
||||
@@ -97,7 +134,7 @@ input[type='checkbox']:checked {
|
||||
<input type="text" id="changeText" class="inputfield" value="http://obs.ninja/?view=" onchange="modURL" onkeyup="enterPressed(event, gohere);" />
|
||||
<button onclick="gohere();" id="gobutton">GO</button>
|
||||
<br><br>
|
||||
<label for="audioOutput">Audio output destination: </label><select id="audioOutput" style="max-width:400px"></select>
|
||||
<label for="audioOutput">Audio output destination: </label><select id="audioOutput"></select>
|
||||
|
||||
</center></div>
|
||||
</div>
|
||||
@@ -126,11 +163,13 @@ function updateOutputTarget(e){
|
||||
document.getElementById('changeText').value = url;
|
||||
}
|
||||
|
||||
function getPermssions(e){
|
||||
function getPermssions(e=null){
|
||||
if (listed==true){
|
||||
return;
|
||||
}
|
||||
e.currentTarget.blur();
|
||||
if (e!==null){
|
||||
e.currentTarget.blur();
|
||||
}
|
||||
navigator.mediaDevices.getUserMedia({audio: true,video: false}).then((stream)=>{
|
||||
navigator.mediaDevices.enumerateDevices().then(gotDevices).catch(console.error); // list all devices
|
||||
stream.getTracks().forEach(track => {
|
||||
@@ -186,6 +225,10 @@ var isMobile = false;
|
||||
if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)){ // does not detect iPad Pros.
|
||||
isMobile=true; // if iOS, default to H264? meh. let's not.
|
||||
}
|
||||
// Windows can show the cursor, since it captures in a different way.
|
||||
if (navigator.platform.indexOf("Win") != -1){
|
||||
document.getElementById("showcursor").checked=true;
|
||||
}
|
||||
|
||||
function updateURLParameter(url, param, paramVal){
|
||||
var TheAnchor = null;
|
||||
@@ -289,9 +332,10 @@ function modURL(ele=false){
|
||||
return url;
|
||||
}
|
||||
function gohere(){
|
||||
var url = modURL(true);
|
||||
window.location = url;
|
||||
};
|
||||
var url = modURL(true);
|
||||
window.location = url;
|
||||
};
|
||||
getPermssions();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
290
index.html
290
index.html
@@ -22,7 +22,7 @@
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="./images/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="./images/favicon-16x16.png" />
|
||||
<link rel="icon" href="./images/favicon.ico" />
|
||||
<link itemprop="thumbnailUrl" href="//images/obsNinja_logo_full.png" />
|
||||
<link itemprop="thumbnailUrl" href="./images/obsNinja_logo_full.png" />
|
||||
<!-- Primary Meta Tags -->
|
||||
<title>OBS.Ninja</title>
|
||||
<meta name="title" content="OBS.Ninja" />
|
||||
@@ -47,14 +47,14 @@
|
||||
<meta property="twitter:image" content="./images/obsNinja_logo_full.png" />
|
||||
<meta name="msapplication-TileColor" content="#da532c" />
|
||||
<meta name="theme-color" content="#ffffff" />
|
||||
<!-- <script src="//console.re/connector.js" data-channel="obsninjaalpha" id="consolerescript"></script> -->
|
||||
<!-- <script src="//console.re/connector.js" data-channel="obsninjaalpha" type="text/javascript" id="consolerescript"></script>-->
|
||||
<link rel="stylesheet" href="./lineawesome/css/line-awesome.min.css">
|
||||
<script type="text/javascript" src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
|
||||
<script type="text/javascript" src="./thirdparty/qrcode.min.js"></script>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
|
||||
<link rel="stylesheet" href="./main.css?ver=10" />
|
||||
<script type="text/javascript" crossorigin="anonymous" src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
|
||||
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/qrcode.min.js"></script>
|
||||
<script type="text/javascript" src="./thirdparty/jquery.min.js"></script>
|
||||
<link rel="stylesheet" href="./main.css?ver=11" />
|
||||
</head>
|
||||
<body id="main">
|
||||
<body id="main" >
|
||||
<span itemprop="image" itemscope itemtype="image/png">
|
||||
<link itemprop="url" href="./images/obsNinja_logo_full.png" />
|
||||
</span>
|
||||
@@ -62,10 +62,10 @@
|
||||
<span itemprop="thumbnail" itemscope itemtype="http://schema.org/ImageObject">
|
||||
<link itemprop="url" href="./images/obsNinja_logo_full.png" />
|
||||
</span>
|
||||
<script language="javascript" type="text/javascript" src="./thirdparty/CodecsHandler.js?ver=17"></script>
|
||||
<script language="javascript" type="text/javascript" src="./webrtc.js?ver=55"></script>
|
||||
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=19"></script>
|
||||
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=60"></script>
|
||||
<input id="zoomSlider" type="range" style="display: none;" />
|
||||
<div id="header">
|
||||
<div id="header"">
|
||||
<a id="logoname" href="./" style="text-decoration: none; color: white; margin: 2px;">
|
||||
<span data-translate="logo-header">
|
||||
<font id="qos">O</font>BS.Ninja
|
||||
@@ -104,18 +104,18 @@
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div id="controlButtons">
|
||||
<div id="controlButtons" >
|
||||
<div id="chatbutton" title="Toggle the Chat" onclick="toggleChat()" class="advanced float" style="cursor: pointer;" alt="Toggle the Chat">
|
||||
<i id="chattoggle" class="toggleSize las la-comment-alt my-float"></i>
|
||||
<div id="chatNotification"></div>
|
||||
</div>
|
||||
<div id="mutebutton" title="Mute the Mic" onclick="toggleMute()" class="advanced float" style="cursor: pointer;" alt="Toggle the mic">
|
||||
<i id="mutetoggle" class="toggleSize las la-microphone my-float"></i>
|
||||
<i id="mutetoggle" class="toggleSize las la-microphone my-float" style="position: relative; top: 0.5px;"></i>
|
||||
</div>
|
||||
<div id="mutevideobutton" title="Disable the Camera" onclick="toggleVideoMute()" class="advanced float" style="cursor: pointer;" alt="Toggle the camera">
|
||||
<i id="mutevideotoggle" class="toggleSize las la-eye my-float"></i>
|
||||
</div>
|
||||
<div id="settingsbutton" title="Settings" onclick="toggleSettings(this)" class="advanced float" style="cursor: pointer;" alt="Toggle the Settings Menu">
|
||||
<div id="settingsbutton" title="Settings" onclick="toggleSettings()" class="advanced float" style="cursor: pointer;" alt="Toggle the Settings Menu">
|
||||
<i id="settingstoggle" class="toggleSize las la-cog my-float"></i>
|
||||
</div>
|
||||
<div id="hangupbutton" title="Hangup the Call" onclick="hangup()" class="advanced float" style="cursor: pointer;" alt="Disconnect and End">
|
||||
@@ -174,10 +174,10 @@
|
||||
<br />
|
||||
<span data-translate="added-notes">
|
||||
<u>
|
||||
<i>Added Notes:</i>
|
||||
<i>Important Notes:</i><br /><br />
|
||||
</u>
|
||||
<li>Invite only guests to the room you trust.</li>
|
||||
<li>iOS devices will share just their audio with other guests; this is mainly a hardware limitation</li>
|
||||
<li>Invite only guests to the room that you trust.</li>
|
||||
<li>iOS devices will share just their audio with other room guests; not video. This is intended as a way to avoid a hardware limitation with iOS devices.</li>
|
||||
<li>The "Recording" option is considered experimental.</li>
|
||||
</span>
|
||||
</ul>
|
||||
@@ -237,7 +237,7 @@
|
||||
</center>
|
||||
<div id="audioMenu" class="form-group multiselect" alt="tip: Hold CTRL (command) to select Multiple" title="tip: Hold CTRL (command) to select Multiple">
|
||||
<a id="multiselect-trigger" class="form-control multiselect-trigger" tabindex="3">
|
||||
<div id="audioTitle" class="title">
|
||||
<div class="audioTitle">
|
||||
<i class="las la-microphone-alt"></i><span data-translate="select-audio-source"> Audio Source(s) </span>
|
||||
<i id='chevarrow1' class="chevron bottom" aria-hidden="true"></i>
|
||||
<div class="meter" id="meter1"></div>
|
||||
@@ -254,8 +254,9 @@
|
||||
</div>
|
||||
<br />
|
||||
<span id="headphonesDiv" style="text-align:left; margin:17px 0; max-width: 550px; min-width: 420px; background-color: #f3f3f3; display: none; padding: 10px 10px; border: 1px solid #ccc; vertical-align: middle;">
|
||||
<div id="audioTitle2" class="title">
|
||||
<i class="las la-headphones"></i><span data-translate="select-output-source"> Audio Output Destination:</span></div>
|
||||
<div class="audioTitle2">
|
||||
<i class="las la-headphones"></i><span data-translate="select-output-source"> Audio Output Destination: <button onclick="playtone()" style="margin:0 0 0 15px;" type="button">Test</button>
|
||||
</span></div>
|
||||
<select id="outputSource" ></select>
|
||||
|
||||
</span>
|
||||
@@ -313,7 +314,7 @@
|
||||
<p id="audioScreenShare1">
|
||||
<span data-translate="audio-sources">Audio Sources</span>
|
||||
<br />
|
||||
<select id="audioSourceScreenshare" multiple alt="tip: Hold CTRL (command) to select Multiple" title="tip: Hold CTRL (command) to select Multiple" style="height: 60px; width: 200px; resize: both; overflow: auto; padding: 5px;" onchange="requestAudioStream();">
|
||||
<select id="audioSourceScreenshare" multiple alt="tip: Hold CTRL (command) to select Multiple" title="tip: Hold CTRL (command) to select Multiple" style="height: 60px; min-width: 290px; resize: both; overflow: auto; padding: 5px;" onchange="requestAudioStream();">
|
||||
<option value="screenshare" selected>
|
||||
<span data-translate="screen-shrae-audio">Screen Share Audio (default)</span>
|
||||
</option>
|
||||
@@ -323,9 +324,12 @@
|
||||
</select>
|
||||
</p>
|
||||
<br />
|
||||
<span id="headphonesDiv2" style="background-color: #f3f3f3; display: none; padding: 5px 10px; border: 1px solid #ccc; vertical-align: middle;">
|
||||
<i class="las la-headphones"></i><span data-translate="select-output-source"> Audio Output Destination:</span>:<br />
|
||||
<select id="outputSourceScreenshare" style="background-color: #FFF; padding:5px; display: display:inline-block;vertical-align: middle;" onclick="requestOutputAudioStream();">
|
||||
<span id="headphonesDiv2" style="background-color: #f3f3f3; min-width: 270px; display: none; padding: 5px 10px; border: 1px solid #ccc; vertical-align: middle;">
|
||||
<i class="las la-headphones"></i>
|
||||
|
||||
<span data-translate="select-output-source"> Audio Output Destination: <button onclick="playtone(true)" style="padding:2px 5px; margin:0;margin-left:15px; position: relative; top: -2px;" type="button">Test</button></span>
|
||||
<br />
|
||||
<select id="outputSourceScreenshare" style="background-color: #FFF; padding:10px 5px; min-width: 268px; display:inline-block; vertical-align: middle;" onclick="requestOutputAudioStream();">
|
||||
<option value="default">
|
||||
<span data-translate="default">Default Device</span>
|
||||
</option>
|
||||
@@ -361,73 +365,76 @@
|
||||
<br />
|
||||
<br />
|
||||
<div style="margin: 20px; max-width: 400px; text-align: left; margin: auto auto;">
|
||||
<br />
|
||||
<h4 style="padding: 0 0 10px 0;">
|
||||
<i>
|
||||
<span data-translate="advanced-paramaters">Advanced Options:</span>
|
||||
</i>
|
||||
</h4>
|
||||
<br />
|
||||
<input type="checkbox" id="invite_bitrate" />
|
||||
<label for="invite_bitrate">
|
||||
<span data-translate="unlock-video-bitrate">Unlock Video Bitrate (20mbps)</span>
|
||||
</label>
|
||||
<br />
|
||||
<input type="checkbox" id="invite_vp9" />
|
||||
<label for="invite_vp9">
|
||||
<span data-translate="force-vp9-video-codec">Force VP9 Video Codec (less artifacting)</span>
|
||||
</label>
|
||||
<br />
|
||||
<input type="checkbox" id="invite_stereo" />
|
||||
<label for="invite_stereo">
|
||||
<span data-translate="enable-stereo-and-pro">Enable Stereo and Pro HD Audio</span>
|
||||
</label>
|
||||
<br />
|
||||
<br />
|
||||
<label for="invite_quality" data-translate="video-resolution">Video Resolution: </label>
|
||||
<select id="invite_quality" name="invite_quality">
|
||||
<option value="-1" selected>User Selectable</option>
|
||||
<option value="0">Maximum Resolution</option>
|
||||
<option value="1">Balanced</option>
|
||||
<option value="2">Smooth and Cool</option>
|
||||
</select>
|
||||
<br />
|
||||
<br />
|
||||
<input type="checkbox" id="invite_secure" />
|
||||
<label for="invite_secure">
|
||||
<span data-translate="high-security-mode">High Security Mode</span>
|
||||
</label>
|
||||
<br />
|
||||
<input type="checkbox" id="invite_hidescreen" />
|
||||
<label for="invite_hidescreen">
|
||||
<span data-translate="hide-screen-share">Hide Screenshare Option</span>
|
||||
</label>
|
||||
<br />
|
||||
<input type="checkbox" id="invite_remotecontrol" />
|
||||
<label for="invite_remotecontrol">
|
||||
<span data-translate="allow-remote-control">Remote Control Camera Zoom (android)</span>
|
||||
</label>
|
||||
<br />
|
||||
<br />
|
||||
<span data-translate="add-a-password-to-stream"> Add a password:</span>
|
||||
<input id="invite_password" placeholder="Add an optional password" />
|
||||
<br />
|
||||
<br />
|
||||
<span data-translate="add-the-guest-to-a-room"> Add the guest to a room:</span>
|
||||
<input id="invite_joinroom" placeholder="Enter Room name here" oninput="document.getElementById('invitegroupchat').style.display='block';" />
|
||||
<br />
|
||||
<br />
|
||||
<span id="invitegroupchat" style="display: none;">
|
||||
<label for="invite_group_chat_type" data-translate="invite-group-chat-type">This room guest can:</label>
|
||||
<select id="invite_group_chat_type" name="invite_group_chat_type">
|
||||
<option value="0" selected data-translate="can-see-and-hear">Can see and hear the group chat</option>
|
||||
<option value="1" data-translate="can-hear-only">Can only hear the group chat</option>
|
||||
<option value="2" data-translate="cant-see-or-hear">Cannot hear or see the group chat</option>
|
||||
</select>
|
||||
</span>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<div class="invite_setting_group">
|
||||
<h4>
|
||||
<span data-translate="advanced-paramaters">Advanced Options</span>
|
||||
</h4>
|
||||
<div class="invite_setting_item">
|
||||
<input type="checkbox" id="invite_bitrate" />
|
||||
<label for="invite_bitrate">
|
||||
<span data-translate="unlock-video-bitrate">Unlock Video Bitrate (20mbps)</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="invite_setting_item">
|
||||
<input type="checkbox" id="invite_vp9" />
|
||||
<label for="invite_vp9">
|
||||
<span data-translate="force-vp9-video-codec">Force VP9 Video Codec (less artifacting)</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="invite_setting_item">
|
||||
<input type="checkbox" id="invite_stereo" />
|
||||
<label for="invite_stereo">
|
||||
<span data-translate="enable-stereo-and-pro">Enable Stereo and Pro HD Audio</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="invite_setting_item">
|
||||
<label for="invite_quality" data-translate="video-resolution">Video Resolution: </label>
|
||||
<select id="invite_quality" name="invite_quality">
|
||||
<option value="-1" selected>User Selectable</option>
|
||||
<option value="0">Maximum Resolution</option>
|
||||
<option value="1">Balanced</option>
|
||||
<option value="2">Smooth and Cool</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="invite_setting_group">
|
||||
<div class="invite_setting_item">
|
||||
<input type="checkbox" id="invite_secure" />
|
||||
<label for="invite_secure">
|
||||
<span data-translate="high-security-mode">High Security Mode</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="invite_setting_item">
|
||||
<input type="checkbox" id="invite_hidescreen" />
|
||||
<label for="invite_hidescreen">
|
||||
<span data-translate="hide-screen-share">Hide Screenshare Option</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="invite_setting_item">
|
||||
<input type="checkbox" id="invite_remotecontrol" />
|
||||
<label for="invite_remotecontrol">
|
||||
<span data-translate="allow-remote-control">Remote Control Camera Zoom (android)</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="invite_setting_item">
|
||||
<span data-translate="add-a-password-to-stream"> Add a password:</span>
|
||||
<input id="invite_password" placeholder="Add an optional password" />
|
||||
</div>
|
||||
<div class="invite_setting_item">
|
||||
<span data-translate="add-the-guest-to-a-room"> Add the guest to a room:</span>
|
||||
<input id="invite_joinroom" placeholder="Enter Room name here" oninput="document.getElementById('invitegroupchat').style.display='block';" />
|
||||
</div>
|
||||
<div class="invite_setting_item">
|
||||
<span id="invitegroupchat" style="display: none;">
|
||||
<label for="invite_group_chat_type" data-translate="invite-group-chat-type">This room guest can:</label>
|
||||
<select id="invite_group_chat_type" name="invite_group_chat_type">
|
||||
<option value="0" selected data-translate="can-see-and-hear">Can see and hear the group chat</option>
|
||||
<option value="1" data-translate="can-hear-only">Can only hear the group chat</option>
|
||||
<option value="2" data-translate="cant-see-or-hear">Cannot hear or see the group chat</option>
|
||||
</select>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>See the
|
||||
<a style="text-decoration: none; color: blue;" target="_blank" href="https://docs.obs.ninja/advanced">documentation</a> for more options and info.
|
||||
</div>
|
||||
@@ -475,8 +482,8 @@
|
||||
</li>
|
||||
<br />
|
||||
|
||||
Site last updated: <a href="https://www.reddit.com/r/OBSNinja/comments/ib7vhk/version_10_released_text_chat_and_more_added_see/">August 26th, 2020</a>. The previous version can be found at
|
||||
<a href="https://obs.ninja/v9/">https://obs.ninja/v9/</a> if you are having new issues.
|
||||
🚨 Site Recently Updated: September 12th, 2020. The previous version can be found at
|
||||
<a href="https://obs.ninja/v11/">https://obs.ninja/v11/</a> if you are having new issues.
|
||||
|
||||
|
||||
<br />
|
||||
@@ -508,30 +515,27 @@
|
||||
<a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a>
|
||||
</div>
|
||||
</div>
|
||||
<div id="gridlayout"></div>
|
||||
<span id="electronDragZone" style="pointer-events: none; z-index:-10; position:absolute;top:0;left:0;width:100%;height:20%;-webkit-app-region: drag;"></span>
|
||||
<div id="gridlayout" ></div>
|
||||
<div id="controls_blank" style="display: none;">
|
||||
<center>
|
||||
<br />
|
||||
<b>
|
||||
<span data-translate="remote-control-for-obs">Remote Control for OBS</span>
|
||||
</b>
|
||||
<br />
|
||||
<button data-value="0" style="font-size: 112%;" onclick="directEnable(this, event);">
|
||||
<span data-translate="add-to-group">Add to Group Scene</span>
|
||||
<b>
|
||||
<button data-value="0" style="padding: 2px 10px 3px 5px;font-weight:display-block;margin: 2px 0 0 5px;" title="Add this Video to any remote '&scene=1'" onclick="directEnable(this, event);">
|
||||
<span data-translate="add-to-group" view">➕ Add to Group Scene</span>
|
||||
</button>
|
||||
<button style="font-size: 112%;" onclick="directMute(this, event);">
|
||||
<span data-translate="mute">Mute</span>
|
||||
</button>
|
||||
<button style="font-size: 112%;" onclick="recordVideo(this, event)">
|
||||
<span data-translate="record">Record</span>
|
||||
<button style="padding: 2px 10px 3px 5px;display:inline-block;margin: 2px 0 0 5px;" title="Start Recording this stream. *experimental*' views" onclick="recordVideo(this, event)">
|
||||
<span data-translate="record">🔴 Record</span>
|
||||
</button>
|
||||
<br />
|
||||
<span data-translate="volume">Volume</span>:
|
||||
<input type="range" min="1" max="100" value="100" onclick="directVolume(this);" />
|
||||
<br />
|
||||
<br />
|
||||
<hr />
|
||||
</center>
|
||||
<button style="padding: 2px 10px 3px 5px;display:inline-block;margin: 2px 0 0 5px;" title="Remotely Mute this Audio in all remote '&scene' views" onclick="directMute(this, event);">
|
||||
<span data-translate="mute" >🔇 Mute in all Scenes</span>
|
||||
</button>
|
||||
<i style="font-size:2vh; position: relative; top: 3px;" title="Change this Audio's volume in all remote '&scene' views" class="las la-volume-up"></i>
|
||||
<input type="range" min="1" max="100" value="100" title="Change this Audio's volume in all remote '&scene' views" onclick="directVolume(this);" style="width: 100px; position: relative; top: 4px;"/>
|
||||
</b>
|
||||
<br />
|
||||
|
||||
<hr style="margin:5px 0 0 0;"/>
|
||||
|
||||
</div>
|
||||
<div id="popupSelector" style="display:none;">
|
||||
<span id="videoMenu3" class="videoMenu">
|
||||
@@ -543,7 +547,7 @@
|
||||
<br />
|
||||
<br />
|
||||
|
||||
<div id="audioMenu3" class="form-group multiselect" alt="tip: Hold CTRL (command) to select Multiple" title="tip: Hold CTRL (command) to select Multiple" style="padding: 10px; background-color:#f3f3f3;">
|
||||
<div class="form-group multiselect" alt="tip: Hold CTRL (command) to select Multiple" title="tip: Hold CTRL (command) to select Multiple" style="padding: 10px; background-color:#f3f3f3;">
|
||||
<a id="multiselect-trigger3" class="form-control multiselect-trigger" tabindex="3">
|
||||
<div id="audioTitle2" class="title">
|
||||
<i class="las la-microphone-alt"></i><span data-translate="select-audio-source"> Audio Source(s) </span>
|
||||
@@ -557,12 +561,11 @@
|
||||
</div>
|
||||
<br />
|
||||
<span id="headphonesDiv3" style="display: inline-block;">
|
||||
<div id="audioTitle3" class="title">
|
||||
<i class="las la-headphones"></i><span data-translate="select-output-source"> Audio Output Destination:</span>
|
||||
<div class="title">
|
||||
<i class="las la-headphones"></i><span data-translate="select-output-source"> Audio Output Destination:
|
||||
</div>
|
||||
<select id="outputSource3" ></select>
|
||||
</span>
|
||||
<br />
|
||||
<button id="shareScreenGear" style="padding:20px;" onclick="grabScreen()"><b>Share Screen</b><br /><i style="padding:5px; font-size:300%;" class="las la-desktop"></i></button><br />
|
||||
<button onclick="toggleSettings()" style="background-color:#EFEFEF;padding:10px 12px 12px 2px;"><i class="chevron right" style="font-size:150%;top:3px;position:relative;"></i> <b>Close Settings</b></button>
|
||||
</p>
|
||||
@@ -578,7 +581,7 @@
|
||||
<li class="context-menu__item">
|
||||
<a href="#" class="context-menu__link" data-action="Copy">
|
||||
<i class="las la-paperclip"></i>
|
||||
<span data-translate="copy-to-clipboard">Copy to Clipboard</span>
|
||||
<span data-translate="copy-to-clipboard" >Copy to Clipboard</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -586,21 +589,25 @@
|
||||
|
||||
<div id="chatModule" style="display:none;">
|
||||
<div id="chatBody">
|
||||
<div class="inMessage">
|
||||
<div class="inMessage" data-translate='welcome-to-obs-ninja-chat'>
|
||||
Welcome to OBS.Ninja! You can send text messages directly to connected peers from here.
|
||||
</div>
|
||||
<div class="outMessage">
|
||||
<div class="outMessage" data-translate='names-and-labels-coming-soon'>
|
||||
Names identifying connected peers will be a feature in an upcoming release.
|
||||
</div>
|
||||
</div>
|
||||
<input id="chatInput" placeholder="Enter chat message to send here"onkeypress="EnterButtonChat(event)" />
|
||||
<button style="width:60px;background-color:#EEE;" onclick="sendChatMessage()">Send</button>
|
||||
<button style="width:60px;background-color:#EEE;" onclick="sendChatMessage()" data-translate='send-chat'>Send</button>
|
||||
</div>
|
||||
|
||||
<audio id="testtone" style="display:none;" preload="none">
|
||||
<source src="tone.mp3" type="audio/mpeg">
|
||||
<source src="tone.ogg" type="audio/ogg">
|
||||
</audio>
|
||||
|
||||
<div id="messagePopup" class="popup-message"></div>
|
||||
<div id="languages" class="popup-message" style="display: none; right: 0; bottom: 25px; position: absolute;">
|
||||
<b>Available Languages:</b>
|
||||
<b data-translate='available-languages'>Available Languages:</b>
|
||||
<br />
|
||||
<u>
|
||||
<a onclick="changeLg('ru');toggle(document.getElementById('languages'));" style="cursor: pointer;">Russian</a>
|
||||
@@ -621,9 +628,11 @@
|
||||
<br />
|
||||
<a onclick="changeLg('ja');toggle(document.getElementById('languages'));" style="cursor: pointer;">Japanese</a>
|
||||
<br />
|
||||
<a onclick="changeLg('pig');toggle(document.getElementById('languages'));" style="cursor: pointer;">Pig Latin</a>
|
||||
<br />
|
||||
</u>
|
||||
<br />
|
||||
<a href="https://github.com/steveseguin/obsninja/tree/master/translations">Add More Here!</a>
|
||||
<a href="https://github.com/steveseguin/obsninja/tree/master/translations" data-translate='add-more-here'>Add More Here!</a>
|
||||
<br />
|
||||
</div>
|
||||
<script>
|
||||
@@ -632,26 +641,29 @@
|
||||
|
||||
session.streamID = session.generateStreamID(); // randomly generates a streamID for this session. You can set your own programmatically if needed
|
||||
|
||||
session.configuration = {
|
||||
iceServers: [
|
||||
{ urls: ["stun:stun.l.google.com:19302", "stun:stun4.l.google.com:19302"] }, // more than 4 stun+turn servers may cause issues
|
||||
],
|
||||
};
|
||||
// session.configuration = {
|
||||
// iceServers: [
|
||||
// { urls: ["stun:stun.l.google.com:19302", "stun:stun4.l.google.com:19302"] }, // more than 4 stun+turn servers may cause issues
|
||||
// ],
|
||||
// sdpSemantics: 'unified-plan'
|
||||
// };
|
||||
|
||||
var turn = {};
|
||||
turn.username = "steve";
|
||||
turn.credential = "justtesting";
|
||||
turn.urls = ["turn:turn.obs.ninja:443"]; // US CENTRAL
|
||||
session.configuration.iceServers.push(turn);
|
||||
// var turn = {};
|
||||
// turn.username = "steve";
|
||||
// turn.credential = "justtesting";
|
||||
// turn.urls = ["turn:turn.obs.ninja:443"]; // US CENTRAL
|
||||
// session.configuration.iceServers.push(turn);
|
||||
|
||||
turn = {};
|
||||
turn.username = "steve";
|
||||
turn.credential = "justtesting";
|
||||
turn.urls = ["turn:turn2.obs.ninja:443"]; // US WEST
|
||||
session.configuration.iceServers.push(turn);
|
||||
// turn = {};
|
||||
// turn.username = "steve";
|
||||
// turn.credential = "justtesting";
|
||||
// turn.urls = ["turn:turn2.obs.ninja:443"]; // US WEST
|
||||
// session.configuration.iceServers.push(turn);
|
||||
|
||||
// session.configuration.iceTransportPolicy = "relay"; // uncomment to enable "&privacy" and force the TURN server
|
||||
|
||||
// session.wss = false;
|
||||
|
||||
///// The following lets you set the defaults
|
||||
|
||||
// session.webcamonly // true,false
|
||||
@@ -686,7 +698,7 @@
|
||||
// If you wish to change branding, blank offers a good clean start.
|
||||
<script type="text/javascript" id="main-js" src="./main.js" data-translation="blank"></script>
|
||||
-->
|
||||
<script type="text/javascript" id="main-js" src="./main.js?ver=36"></script>
|
||||
<script type="text/javascript" src="./animations.js?ver=8"></script>
|
||||
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=40"></script>
|
||||
<script type="text/javascript" crossorigin="anonymous" src="./animations.js?ver=10"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
79
install.md
Normal file
79
install.md
Normal file
@@ -0,0 +1,79 @@
|
||||
Deploying this code. A guide. (INITIAL DRAFT VERSION)
|
||||
|
||||
### PREFACE
|
||||
|
||||
The code is obvious enough already that someone experienced with the NGINX webserver or with basic site deployments should have no problem getting things running.
|
||||
|
||||
I'm concerned at times that less experienced users will be deploying the code without really understanding why or properly how to. There are few cases a person needs to deploy any code.
|
||||
|
||||
Those reasons are: wanting custom branding; contributing as a developer to the codebase; or deploying a private TURN server.
|
||||
|
||||
For a subset of those users even, they might still have better options available.
|
||||
|
||||
I offer https://rtc.ninja for those looking for a brand-free experience already. You can also point your domain to the OBS.Ninja IP address (provided on request), which will also rebrand the site automatically to match your domain name.
|
||||
|
||||
For those wanting a private TURN server setup, you can load the settings for those via the URL parameters. If infrequently needing a private TURN, this is a great solution.
|
||||
|
||||
There are also misconceptions. Deploying the website code will NOT make the service faster. The service is peer-to-peer based, so deploying servers will not make it faster. Even deploying a TURN server is often not the best choice, as using a VPN, cloud VM for OBS, or disabling any symmetrical firewall will often provide a better end result.
|
||||
|
||||
Understanding clearly why you need to deploy any code or server is important. If you do know why, please continue.
|
||||
|
||||
### SETUP
|
||||
|
||||
I use Cloudflare with Flexible SSL enabled and HTTP Rewrites. If you do not use Cloudflare, you will need to deploy SSL certificates onto your website. You will also have to have Cloudflare or whatever DNS provider you have, point your domain name to the IP address of your webserver. OBS.Ninja REQUIRES a domain name and SSL.
|
||||
|
||||
For webservers, I use NGINX on a Ubuntu server; smaller the better. I rely on Cloudflare to provide caching and SSL, so my installation of NGINX is pretty simple.
|
||||
```
|
||||
sudo apt-get update
|
||||
apt-get install nginx -y
|
||||
sudo vi /etc/nginx/sites-available/default
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
An example NGINX config file that "hides" the file extensions is as follows. Update the file as needed and
|
||||
|
||||
```server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
|
||||
server_name obs.ninja;
|
||||
|
||||
root /var/www/html/obs.ninja;
|
||||
index index.html;
|
||||
|
||||
|
||||
location ~ ^/([^/]+)/([^/?]+)$ {
|
||||
root /var/www/html/obs.ninja;
|
||||
try_files /$1/$2 /$1/$2.html /$1/$2/ /$2 /$2/ /$1/index.html;
|
||||
add_header Access-Control-Allow-Origin *;
|
||||
}
|
||||
|
||||
location / {
|
||||
if ($request_uri ~ ^/(.*)\.html$) {
|
||||
return 302 /$1;
|
||||
}
|
||||
try_files $uri $uri.html $uri/ /index.html;
|
||||
add_header Access-Control-Allow-Origin *;
|
||||
}
|
||||
}
|
||||
```
|
||||
You'll want to deploy (copy/clone) the GitHub OBS.Ninja files into your NGINX web folder, that is specified in your NGINX config file. Update the NGINX config file to match your domain and and folder, etc. Restart NGINX after.
|
||||
|
||||
|
||||
As for the TURN server, it can run on a single or dual-core computer. It doesn't take much to host many users -- it mainly just needs a good internet connection. Most users will not need a TURN server, but since OBS.Ninja handles many different types of users, the TURN server is there as a failsafe for those occasional problem users. I'm assuming you know why you need and want a TURN server -- if not, you may not actually need one.
|
||||
|
||||
A guide and sample config file for the turn server is here:
|
||||
https://github.com/steveseguin/obsninja/blob/master/turnserver.md
|
||||
|
||||
If deploying to GCP or AWS, you might need to make some tweaks to the IP address values to include the internet local IP as well as the external. Please see online guides no setting up a TURN server for your particular setup. Setups will vary.
|
||||
|
||||
Once you have your TURN server setup, you can update the index.html of the OBS.Ninja code. Nightly or official releases should be fine to pull. You probably will want to uncomment the lines linked below once deployed, adjusting the default values to your liking and updating the server location address and credentials of your TURN server (if you deployed one that is). Unless your TURN server also provides STUN capabilities, you may want to also use the Google STUN servers, so uncomment that stuff too.
|
||||
|
||||
https://github.com/steveseguin/obsninja/blob/df6c147311b9e7d19659ddbb1799d6598f59aa0d/index.html#L644
|
||||
|
||||
A newly deployed code deployment should work without any changes to the index.html file. The code needs to be constantly kept up to date though, as after a few months it may become deprecated and stop working. This is the reality of deploying OBS.Ninja -- you will need to update it every few months for it to continue to function well. Keep this in mind when making changes to the OBS.Ninja source code, as heavy custom changes will make updating harder to do. The fewer the changes the better.
|
||||
|
||||
My suggestion? Limit changes to images and perhaps the translation files (maybe add a new one); these are good starting points. If making changes to the main.css style sheet or index.html file, you should be mostly okay too, since these files are designed to be changed; I try to keep that in mind when updating the code at least. Making changes to other files though is strongly not recommend and in some cases discouraged. If you find a bug or need to make a change to other files, it might be best to make a Pull Request with the desired changes and hope it gets adopted into the main codebase.
|
||||
|
||||
Regards,
|
||||
Steve
|
||||
153
main.css
153
main.css
@@ -50,12 +50,13 @@ a:active {
|
||||
input {
|
||||
border-radius: 4px;
|
||||
padding:2px;
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 7px;
|
||||
border: 1px solid #4444;
|
||||
|
||||
-webkit-app-region: no-drag;
|
||||
padding:5px 10px 3px 10px;
|
||||
margin:10px 0px;
|
||||
}
|
||||
@@ -171,7 +172,18 @@ hr {
|
||||
margin:0;
|
||||
}
|
||||
|
||||
|
||||
/* Invite link generator */
|
||||
.invite_setting_group {
|
||||
margin: 20px 0px;
|
||||
background-color: #d2d2d2;
|
||||
padding: 10px;
|
||||
}
|
||||
.invite_setting_group h4 {
|
||||
margin:10px 0px 20px;
|
||||
}
|
||||
.invite_setting_item {
|
||||
margin: 10px 0px;
|
||||
}
|
||||
|
||||
.directorsgrid {
|
||||
justify-items: normal;
|
||||
@@ -181,16 +193,15 @@ hr {
|
||||
overflow-y: auto !important;
|
||||
|
||||
}
|
||||
.directorsgrid video {
|
||||
max-width: 400px;
|
||||
max-height: 225px;
|
||||
min-width: 300px;
|
||||
.directorsgrid .vidcon video {
|
||||
height: 169px;
|
||||
width: 300px;
|
||||
padding:10px 10px 0px 10px !important;
|
||||
}
|
||||
|
||||
.directorsgrid .vidcon {
|
||||
display: inline-block !important;
|
||||
max-width: 400px !important;
|
||||
width: 300px !important;
|
||||
max-height: 500px !important;
|
||||
background: #E3E4EF;
|
||||
}
|
||||
@@ -219,6 +230,21 @@ hr {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
button.glyphicon-button:focus,
|
||||
button.glyphicon-button:active:focus,
|
||||
button.glyphicon-button.active:focus,
|
||||
button.glyphicon-button.focus,
|
||||
button.glyphicon-button:active.focus,
|
||||
button.glyphicon-button.active.focus {
|
||||
outline: none !important;
|
||||
}
|
||||
|
||||
#main{
|
||||
-webkit-tap-highlight-color: rgba(255, 255, 255, 0) !important;
|
||||
-webkit-tap-highlight-color: transparent !important;
|
||||
outline: 0px !important;
|
||||
}
|
||||
|
||||
video::-webkit-media-controls-current-time-display{
|
||||
display:none;
|
||||
}
|
||||
@@ -240,7 +266,6 @@ video::-webkit-media-controls-toggle-closed-captions-button{
|
||||
}
|
||||
|
||||
|
||||
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
transform: scale(0.95);
|
||||
@@ -278,6 +303,7 @@ video::-webkit-media-controls-toggle-closed-captions-button{
|
||||
html {
|
||||
border:0;
|
||||
margin:0;
|
||||
outline:0;
|
||||
}
|
||||
|
||||
li {
|
||||
@@ -718,6 +744,8 @@ img {
|
||||
|
||||
.rotate225 {
|
||||
transform: rotate(135deg);
|
||||
position: relative;
|
||||
top: 1px;
|
||||
}
|
||||
|
||||
|
||||
@@ -905,7 +933,6 @@ img {
|
||||
}
|
||||
|
||||
video {
|
||||
|
||||
background-color: transparent !important;
|
||||
border:0;
|
||||
margin:0;
|
||||
@@ -980,12 +1007,12 @@ video {
|
||||
background-color: #0066aa !important;
|
||||
}
|
||||
|
||||
#audioTitle{
|
||||
.audioTitle {
|
||||
text-align:left;
|
||||
padding: 7px 0px;
|
||||
}
|
||||
|
||||
#audioTitle2{
|
||||
.audioTitle2 {
|
||||
text-align:left;
|
||||
padding: 0px 10px 10px 1px;
|
||||
}
|
||||
@@ -1047,7 +1074,7 @@ video {
|
||||
max-height:100%;
|
||||
background-color:white;
|
||||
|
||||
padding: 3px;
|
||||
padding: 0px;
|
||||
font-size:93%;
|
||||
}
|
||||
|
||||
@@ -1254,6 +1281,108 @@ input[type=checkbox]
|
||||
|
||||
}
|
||||
|
||||
.debugStats {
|
||||
font-size: 0.8rem;
|
||||
list-style-type: none;
|
||||
left: 50px;
|
||||
top: 50px;
|
||||
width: 300px;
|
||||
min-height: 200px;
|
||||
max-height: 90vh;
|
||||
overflow-y: auto;
|
||||
background-color: rgba(0,0,0,0.95);
|
||||
position: absolute;
|
||||
z-index: 20;
|
||||
color: white;
|
||||
padding: 20px;
|
||||
border: 2px solid #1d1d1d;
|
||||
}
|
||||
|
||||
.debugStats::-webkit-scrollbar {
|
||||
width: 0.5em;
|
||||
}
|
||||
|
||||
.debugStats::-webkit-scrollbar-track {
|
||||
background:black;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
/* Handle */
|
||||
.debugStats::-webkit-scrollbar-thumb {
|
||||
background: rgb(119, 119, 119);
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
/* Handle on hover */
|
||||
.debugStats::-webkit-scrollbar-thumb:hover {
|
||||
background: rgb(158, 158, 158); ;
|
||||
}
|
||||
|
||||
.debugStats h1 {
|
||||
font-size: 1rem;
|
||||
text-align: left;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 10px;
|
||||
margin-top: -5px;
|
||||
}
|
||||
|
||||
.debugStats h2 {
|
||||
font-size: 0.8rem;
|
||||
text-align: left;
|
||||
text-transform: uppercase;
|
||||
margin-top: 10px;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
display:block;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.viewstats::-webkit-scrollbar-track {
|
||||
box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.debugStats li {
|
||||
display: flex;
|
||||
margin: 5px 0px;
|
||||
}
|
||||
|
||||
.debugStats li:nth-child(even) {
|
||||
background: rgba(33,33,33,0.8);
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
.debugStats li span:first-child {
|
||||
flex: 1;
|
||||
}
|
||||
.debugStats li span:last-child {
|
||||
flex: 1;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.debugStats .close {
|
||||
font-weight: bold;
|
||||
color:white;
|
||||
display: block;
|
||||
background:none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 1.5rem;
|
||||
border:none;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
}
|
||||
|
||||
.debugStats button:not(.close) {
|
||||
margin: 10px 0px;
|
||||
padding: 10px 0px;
|
||||
background: #263250;
|
||||
color: white;
|
||||
border-radius: 0;
|
||||
width: 100%;
|
||||
font-weight: bold;
|
||||
border-bottom: 2px solid #364c84;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 390px) {
|
||||
#chatBody{
|
||||
z-index: 12;
|
||||
|
||||
579
main.js
579
main.js
@@ -66,25 +66,27 @@ var urlParams = new URLSearchParams(window.location.search);
|
||||
|
||||
if (window.obsstudio){
|
||||
session.obsfix=true; // can be manually set via URL.
|
||||
log("OBS VERSION:"+window.obsstudio.pluginVersion);
|
||||
log("macOS: "+navigator.userAgent.indexOf('Mac OS X') != -1);
|
||||
log(window.obsstudio);
|
||||
|
||||
if (!(urlParams.has('streamlabs'))){
|
||||
try{
|
||||
log("OBS VERSION:"+window.obsstudio.pluginVersion);
|
||||
log("macOS: "+navigator.userAgent.indexOf('Mac OS X') != -1);
|
||||
log(window.obsstudio);
|
||||
|
||||
var ver1 = window.obsstudio.pluginVersion;
|
||||
ver1 = ver1.split(".");
|
||||
updateURL("streamlabs");
|
||||
if (ver1.length == 3){ // Should be 3, but disabled3
|
||||
if ((ver1.length == 3) && (parseInt(ver1[0])==2) && (parseInt(ver1[1])>4) && (navigator.userAgent.indexOf('Mac OS X') != -1)){
|
||||
getById("main").innerHTML = "<div style='background-color:black;color:white;'><h1>On macOS, Please use OBS v23, as OBS v24 and v25 are not supported currently.</h1>\
|
||||
<br /><h2> Please find details <u><a href='https://github.com/steveseguin/obsninja/wiki/FAQ#mac-os'>within our wiki guide - https://github.com/steveseguin/obsninja/wiki/FAQ#mac-os</a></u></h2>\
|
||||
<br /> You can bypass this error message by refreshing, <a href='"+ window.location.href +"'> Clicking Here,</a> or by adding <i>&streamlabs</i> to the URL.\
|
||||
<br /> Please report this problem to steve@seguin.email if you feel it is an error.\
|
||||
</div>";
|
||||
if (!(urlParams.has('streamlabs'))){
|
||||
|
||||
var ver1 = window.obsstudio.pluginVersion;
|
||||
ver1 = ver1.split(".");
|
||||
updateURL("streamlabs");
|
||||
if (ver1.length == 3){ // Should be 3, but disabled3
|
||||
if ((ver1.length == 3) && (parseInt(ver1[0])==2) && (parseInt(ver1[1])>4) && (navigator.userAgent.indexOf('Mac OS X') != -1)){
|
||||
getById("main").innerHTML = "<div style='background-color:black;color:white;' data-translate='obs-macos-not-supported'><h1>On macOS, Please use the <a href='https://github.com/steveseguin/electroncapture'>Electron Capture app</a>, or OBS v23, as newer versions of OBS are not supported currently on macOS.</h1>\
|
||||
<br /><h2> You can find details <u><a href='https://github.com/steveseguin/obsninja/wiki/FAQ#mac-os'>within our wiki guide - https://github.com/steveseguin/obsninja/wiki/FAQ#mac-os</a></u></h2>\
|
||||
<br /> If using OBS v23 or Streamlabs, you can bypass this error message by refreshing, <a href='"+ window.location.href +"'> Clicking Here,</a> or by adding <i>&streamlabs</i> to the URL.\
|
||||
<br /> Please report this problem to steve@seguin.email if you feel it is an error.\
|
||||
</div>";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(e){errorlog(e);}
|
||||
|
||||
window.addEventListener('obsSceneChanged', function(event) {
|
||||
log("OBS EVENT");
|
||||
@@ -323,6 +325,8 @@ if (urlParams.has('stereo') || urlParams.has('s') || urlParams.has('proaudio')){
|
||||
session.stereo = 1;
|
||||
} else if (session.stereo==="3"){
|
||||
session.stereo = 3;
|
||||
} else if (session.stereo==="4"){
|
||||
session.stereo = 4;
|
||||
} else if (session.stereo==="2"){
|
||||
session.stereo = 2;
|
||||
} else {
|
||||
@@ -330,7 +334,7 @@ if (urlParams.has('stereo') || urlParams.has('s') || urlParams.has('proaudio')){
|
||||
}
|
||||
}
|
||||
|
||||
if ((session.stereo==1) || (session.stereo==3)){
|
||||
if ((session.stereo==1) || (session.stereo==3) || (session.stereo==4)){
|
||||
session.echoCancellation = false;
|
||||
session.autoGainControl = false;
|
||||
session.noiseSuppression = false;
|
||||
@@ -437,9 +441,10 @@ if (urlParams.has('streamid') || urlParams.has('view') || urlParams.has('v') ||
|
||||
|
||||
}
|
||||
|
||||
if (urlParams.has('icefilter')){
|
||||
log("ICE FILTER ENABLED");
|
||||
session.icefilter = urlParams.get('icefilter');
|
||||
|
||||
if (urlParams.has('nopreview')){
|
||||
log("preview OFF");
|
||||
session.nopreview = true;
|
||||
}
|
||||
|
||||
if (urlParams.has('obsfix')){
|
||||
@@ -534,9 +539,9 @@ if (urlParams.has("autojoin") || urlParams.has("autostart") || urlParams.has("aj
|
||||
}
|
||||
|
||||
|
||||
if (urlParams.has('novideo') || urlParams.has('nv') || urlParams.has('hidevideo')){
|
||||
if (urlParams.has('novideo') || urlParams.has('nv') || urlParams.has('hidevideo') || urlParams.has('showonly') ){
|
||||
|
||||
session.novideo = urlParams.get('novideo') || urlParams.get('nv') || urlParams.has('hidevideo');
|
||||
session.novideo = urlParams.get('novideo') || urlParams.get('nv') || urlParams.get('hidevideo') || urlParams.get('showonly');
|
||||
|
||||
if (!(session.novideo)){
|
||||
session.novideo=[];
|
||||
@@ -547,10 +552,9 @@ if (urlParams.has('novideo') || urlParams.has('nv') || urlParams.has('hidevideo'
|
||||
log(session.novideo);
|
||||
}
|
||||
|
||||
if (urlParams.has('noaudio') || urlParams.has('na') || urlParams.has('hideaudio')){
|
||||
if (urlParams.has('noaudio') || urlParams.has('na') || urlParams.has('hideaudio') ){
|
||||
|
||||
session.noaudio = urlParams.get('noaudio') || urlParams.get('na') || urlParams.has('hideaudio');
|
||||
errorlog(session.noaudio);
|
||||
session.noaudio = urlParams.get('noaudio') || urlParams.get('na') || urlParams.get('hideaudio') ;
|
||||
|
||||
if (!(session.noaudio)){
|
||||
session.noaudio=[];
|
||||
@@ -736,7 +740,9 @@ function changeLg(lang){
|
||||
//log(ele.dataset.translate);
|
||||
//log(translations[ele.dataset.translate]);
|
||||
try {
|
||||
ele.innerHTML = data[ele.dataset.translate];
|
||||
if (ele.dataset.translate in data){
|
||||
ele.innerHTML = data[ele.dataset.translate];
|
||||
}
|
||||
} catch (e){
|
||||
errorlog(e);
|
||||
}
|
||||
@@ -911,27 +917,65 @@ if ((session.mirrored) && (session.flipped)){
|
||||
}
|
||||
|
||||
|
||||
if (urlParams.has('icefilter')){
|
||||
log("ICE FILTER ENABLED");
|
||||
session.icefilter = urlParams.get('icefilter');
|
||||
}
|
||||
|
||||
if (urlParams.has('twilio')){ // Not for public use.
|
||||
|
||||
}
|
||||
|
||||
|
||||
var turn = {};
|
||||
if (urlParams.has('turn')){
|
||||
try {
|
||||
var turnstring = urlParams.get('turn').split(";");
|
||||
if (turnstring !== "false"){ // false disables the TURN server. Useful for debuggin
|
||||
turn = {};
|
||||
turn.username = turnstring[0]; // myusername
|
||||
turn.credential = turnstring[1]; //mypassword
|
||||
turn.urls = [turnstring[2]]; // ["turn:turn.obs.ninja:443"];
|
||||
session.configuration.iceServers = [{ urls: ["stun:stun.l.google.com:19302", "stun:stun4.l.google.com:19302" ]}]
|
||||
session.configuration.iceServers.push(turn);
|
||||
var turnstring = urlParams.get('turn');
|
||||
if (turnstring=="twilio"){
|
||||
try{
|
||||
var request = new XMLHttpRequest();
|
||||
request.open('GET', 'https://api.obs.ninja/twilio', false); // `false` makes the request synchronous
|
||||
request.send(null);
|
||||
|
||||
if (request.status === 200) {
|
||||
log(request.responseText);
|
||||
var res = JSON.parse(request.responseText);
|
||||
|
||||
session.configuration = {
|
||||
iceServers: [
|
||||
{ "username": res["1"],
|
||||
"credential": res["2"],
|
||||
"url": "turn:global.turn.twilio.com:3478?transport=tcp",
|
||||
"urls": "turn:global.turn.twilio.com:3478?transport=tcp"
|
||||
},
|
||||
{ "username": res["1"],
|
||||
"credential": res["2"],
|
||||
"url": "turn:global.turn.twilio.com:443?transport=tcp",
|
||||
"urls": "turn:global.turn.twilio.com:443?transport=tcp"
|
||||
}
|
||||
],
|
||||
sdpSemantics: 'unified-plan' // future-proofing
|
||||
};
|
||||
}
|
||||
} catch(e){errorlog("Twilio Failed");}
|
||||
} else {
|
||||
try {
|
||||
turnstring = turnstring.split(";");
|
||||
if (turnstring !== "false"){ // false disables the TURN server. Useful for debuggin
|
||||
var turn = {};
|
||||
turn.username = turnstring[0]; // myusername
|
||||
turn.credential = turnstring[1]; //mypassword
|
||||
turn.urls = [turnstring[2]]; // ["turn:turn.obs.ninja:443"];
|
||||
session.configuration.iceServers = [{ urls: ["stun:stun.l.google.com:19302", "stun:stun4.l.google.com:19302" ]}]
|
||||
session.configuration.iceServers.push(turn);
|
||||
}
|
||||
} catch (e){
|
||||
alert("TURN server parameters were wrong.");
|
||||
errorlog(e);
|
||||
}
|
||||
} catch (e){
|
||||
alert("TURN server parameters were wrong.");
|
||||
errorlog(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (urlParams.has('privacy')){ // please only use if you are also using your own TURN service.
|
||||
if (urlParams.has('privacy') || urlParams.has('private') || urlParams.has('relay')){ // please only use if you are also using your own TURN service.
|
||||
try {
|
||||
session.configuration.iceTransportPolicy = "relay"; // https://developer.mozilla.org/en-US/docs/Web/API/RTCIceCandidate/address
|
||||
} catch (e){
|
||||
@@ -1137,9 +1181,9 @@ if ( (session.roomid) || (urlParams.has('roomid')) || (urlParams.has('r')) || (u
|
||||
}
|
||||
getById("info").innerHTML = "";
|
||||
getById("info").style.color="#CCC";
|
||||
getById("videoname1").value = roomid;
|
||||
getById("dirroomid").innerHTML = roomid;
|
||||
getById("roomid").innerHTML = roomid;
|
||||
getById("videoname1").value = session.roomid;
|
||||
getById("dirroomid").innerHTML = session.roomid;
|
||||
getById("roomid").innerHTML = session.roomid;
|
||||
getById("container-1").className = 'column columnfade advanced';
|
||||
getById("container-4").className = 'column columnfade advanced';
|
||||
getById("mainmenu").style.alignSelf= "center";
|
||||
@@ -1182,7 +1226,7 @@ if ( (session.roomid) || (urlParams.has('roomid')) || (urlParams.has('r')) || (u
|
||||
getById("translateButton").style.display = "none";
|
||||
log("Update Mixer Event on REsize SET");
|
||||
window.addEventListener("resize", updateMixer);
|
||||
joinRoom(roomid); // this is a scene, so we want high resolutions
|
||||
joinRoom(session.roomid); // this is a scene, so we want high resolutions
|
||||
getById("main").style.overflow = "hidden";
|
||||
}
|
||||
} else if (urlParams.has('director')){ // if I do a short form of this, it will cause duplications in the code elsewhere.
|
||||
@@ -1201,6 +1245,11 @@ if (urlParams.has('hidemenu')){ // needs to happen the room and permaid applica
|
||||
getById("header").style.opacity = 0;
|
||||
}
|
||||
|
||||
if (urlParams.has('hideheader')){ // needs to happen the room and permaid applications
|
||||
getById("header").style.display="none";
|
||||
getById("header").style.opacity = 0;
|
||||
}
|
||||
|
||||
function checkConnection(){
|
||||
if (document.getElementById("qos")){ // true or false; null might cause problems?
|
||||
if ((session.ws) && (session.ws.readyState === WebSocket.OPEN)) {
|
||||
@@ -1213,6 +1262,75 @@ function checkConnection(){
|
||||
setInterval(function(){checkConnection();},5000);
|
||||
|
||||
|
||||
function printViewStats(menu, statsObj, streamID){ // Stats for viewing a remote video
|
||||
|
||||
menu.innerHTML="StreamID: <b>"+streamID+"</b><br />";
|
||||
menu.innerHTML+= printValues(statsObj);
|
||||
|
||||
}
|
||||
function printValues(obj) { // see: printViewStats
|
||||
var out = "";
|
||||
for (var key in obj) {
|
||||
if (typeof obj[key] === "object") {
|
||||
if (obj[key]!=null){
|
||||
out += "<li><h2 title='" + key + "'>"+key+"</h2></li>"
|
||||
out += printValues(obj[key]);
|
||||
}
|
||||
} else {
|
||||
if (key.startsWith("_")){
|
||||
// if it starts with _, we don't want to show it.
|
||||
} else {
|
||||
var unit = '';
|
||||
var stat = key;
|
||||
if(key == 'Bitrate_in_kbps') {
|
||||
var unit = " kbps";
|
||||
stat = "Bitrate";
|
||||
}
|
||||
if(key == 'type') {
|
||||
var unit = "";
|
||||
stat = 'Type';
|
||||
}
|
||||
if(key == 'packetLoss_in_percentage') {
|
||||
var unit = " %";
|
||||
stat = 'Packet Loss';
|
||||
}
|
||||
if(key == 'Buffer_Delay_in_ms') {
|
||||
var unit = " ms";
|
||||
stat = 'Buffer Delay';
|
||||
}
|
||||
out +="<li><span>"+stat+"</span><span>"+obj[key]+ unit + "</span></li>";
|
||||
}
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
function printMyStats(menu){ // see: setupStatsMenu
|
||||
menu.innerHTML="";
|
||||
|
||||
session.stats.outbound_connections = Object.keys(session.pcs).length;
|
||||
session.stats.inbound_connections = Object.keys(session.rpcs).length;
|
||||
|
||||
|
||||
function printViewValues(obj) {
|
||||
for (var key in obj) {
|
||||
if (typeof obj[key] === "object") {
|
||||
printViewValues(obj[key]);
|
||||
} else {
|
||||
menu.innerHTML +="<li><span>"+key+"</span><span>"+obj[key]+"</span></li>";
|
||||
}
|
||||
}
|
||||
}
|
||||
printViewValues(session.stats);
|
||||
menu.innerHTML+="<button onclick='session.forcePLI(null,event);'>Send Keyframe to Viewers</button>";
|
||||
for (var uuid in session.pcs){
|
||||
printViewValues(session.pcs[uuid].stats);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
function updateStats(obsvc=false){
|
||||
log('resolution found');
|
||||
if (!(getById('previewWebcam'))){return;} // Don't show unless preview (or new stats pane is added)
|
||||
@@ -1315,8 +1433,7 @@ function toggleVideoMute(apply=false){ // TODO: I need to have this be MUTE, tog
|
||||
}
|
||||
}
|
||||
|
||||
function toggleSettings(ele=null){ // TODO: I need to have this be MUTE, toggle, with volume not touched.
|
||||
|
||||
function toggleSettings(){ // TODO: I need to have this be MUTE, toggle, with volume not touched.
|
||||
|
||||
if (getById("popupSelector").style.display=="none"){
|
||||
|
||||
@@ -1362,13 +1479,13 @@ function directEnable(ele, event){ // A directing room only is controlled by the
|
||||
if (ele.parentNode.parentNode.dataset.enable==1){
|
||||
ele.parentNode.parentNode.dataset.enable = 0;
|
||||
ele.className = "";
|
||||
ele.innerHTML = "Add to Group Scene";
|
||||
ele.innerHTML = "➕ Add to Group Scene";
|
||||
ele.parentNode.parentNode.style.backgroundColor = "#E3E4FF";
|
||||
} else {
|
||||
ele.parentNode.parentNode.style.backgroundColor = "#AFA";
|
||||
ele.parentNode.parentNode.dataset.enable = 1;
|
||||
ele.className = "pressed";
|
||||
ele.innerHTML = "Remove from Group Scene";
|
||||
ele.innerHTML = "➖ Remove from Scene";
|
||||
}
|
||||
}
|
||||
var msg = {};
|
||||
@@ -1388,11 +1505,11 @@ function directMute(ele, event){ // A directing room only is controlled by the D
|
||||
if (ele.parentNode.parentNode.dataset.mute==0){
|
||||
ele.parentNode.parentNode.dataset.mute = 1;
|
||||
ele.className = "";
|
||||
ele.innerHTML = "Mute";
|
||||
ele.innerHTML = "🔇 Mute in all Scenes";
|
||||
} else {
|
||||
ele.parentNode.parentNode.dataset.mute = 0;
|
||||
ele.className = "pressed";
|
||||
ele.innerHTML = "Unmute";
|
||||
ele.innerHTML = "🔊 un-Mute all Scenes";
|
||||
}
|
||||
}
|
||||
var msg = {};
|
||||
@@ -1416,6 +1533,8 @@ function directVolume(ele){ // A directing room only is controlled by the Direct
|
||||
msg.target = ele.parentNode.parentNode.dataset.UUID; // i want to focus on the STREAM ID, not the UUID...
|
||||
msg.value = ele.value;
|
||||
|
||||
// session.anysend(msg // msg.UUID -> can't do this yet as DIRECTOR isn't "verfied" via WebRTC yet. ALSO,
|
||||
// need to send to just scenes, and that isn't the case as voice is push to talk setup first. RTC is off by default then.
|
||||
session.sendMsg(msg); // send to everyone in the room, so they know if they are on air or not.
|
||||
}
|
||||
|
||||
@@ -1677,42 +1796,42 @@ function volumeAudioProcess( event ) {
|
||||
this.volume = Math.max(rms, this.volume*this.averaging);
|
||||
}
|
||||
|
||||
function joinRoom(roomname, maxbitrate=false){
|
||||
function joinRoom(roomname){
|
||||
roomname = roomname.replace(/[^0-9a-z]/gi, '');
|
||||
if (roomname.length){
|
||||
log("Join room",roomname);
|
||||
log(roomname);
|
||||
session.joinRoom(roomname, maxbitrate).then(function(response){ // callback from server; we've joined the room
|
||||
if (roomname.length){
|
||||
log("Join room");
|
||||
log(roomname);
|
||||
session.joinRoom(roomname).then(function(response){ // callback from server; we've joined the room
|
||||
|
||||
if (session.director){
|
||||
var msg = {};
|
||||
msg.request = "claim";
|
||||
session.sendMsg(msg);
|
||||
}
|
||||
|
||||
if (session.director){
|
||||
var msg = {};
|
||||
msg.request = "claim";
|
||||
session.sendMsg(msg);
|
||||
}
|
||||
|
||||
log("Members in Room");
|
||||
log(response);
|
||||
for (var i in response){
|
||||
if ("UUID" in response[i]){
|
||||
if ("streamID" in response[i]){
|
||||
if (response[i].UUID in session.pcs){
|
||||
log("RTC already connected"); /// lets just say instead of Stream, we have
|
||||
} else {
|
||||
//var title = ""; // TODO: Assign labels
|
||||
//if ("title" in response[i]){
|
||||
// title = response[i]["title"];
|
||||
//}
|
||||
|
||||
play(response[i].streamID); // play handles the group room mechanics here
|
||||
}
|
||||
log("Members in Room");
|
||||
log(response);
|
||||
for (var i in response){
|
||||
if ("UUID" in response[i]){
|
||||
if ("streamID" in response[i]){
|
||||
if (response[i].UUID in session.pcs){
|
||||
log("RTC already connected"); /// lets just say instead of Stream, we have
|
||||
} else {
|
||||
//var title = ""; // TODO: Assign labels
|
||||
//if ("title" in response[i]){
|
||||
// title = response[i]["title"];
|
||||
//}
|
||||
|
||||
play(response[i].streamID); // play handles the group room mechanics here
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
},function(error){return {};});
|
||||
} else {
|
||||
log("Room name not long enough or contained all bad characaters");
|
||||
}
|
||||
},function(error){return {};});
|
||||
} else {
|
||||
log("Room name not long enough or contained all bad characaters");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1757,8 +1876,19 @@ function createRoom(roomname=false){
|
||||
getById("roomid").innerHTML = roomname;
|
||||
|
||||
|
||||
try{
|
||||
if (document.title==""){
|
||||
document.title = "Control Room";
|
||||
} else {
|
||||
document.title += " - Control Room";
|
||||
}
|
||||
} catch(e){errorlog(e);};
|
||||
|
||||
|
||||
session.director = true;
|
||||
getById("reshare").parentNode.removeChild(getById("reshare"));
|
||||
getById("chatbutton").classList.remove("advanced");
|
||||
getById("controlButtons").style.display = "inherit";
|
||||
|
||||
var passAdd="";
|
||||
var passAdd2="";
|
||||
@@ -1767,36 +1897,76 @@ function createRoom(roomname=false){
|
||||
passAdd2="&password="+session.password;
|
||||
}
|
||||
|
||||
gridlayout.innerHTML = "<br /><div style='display:inline-block'><font style='font-size:130%;color:white;'></font><input onclick='popupMessage(event);copyFunction(this)' onmousedown='copyFunction(this)' style='cursor:grab;font-weight:bold;background-color:#78F; width:400px; font-size:100%; padding:10px; border:2px solid black; margin:5px;' class='task' value='https://"+location.host+location.pathname+"?room="+session.roomid+passAdd+"' /><font style='font-size:110%;color:white;'><i class='las la-video' style='position:relative;top:7px;font-size:2em;' aria-hidden='true'></i> - Invites users to join the group and broadcast their feed to it. These users will see every feed, so performance problems may arise for some guests if too many people join a room.</font></div>";
|
||||
gridlayout.innerHTML = "<br /><div style='display:inline-block'><font style='font-size:130%;color:white;'></font><input onclick='popupMessage(event);copyFunction(this)' onmousedown='copyFunction(this)' style='cursor:grab;font-weight:bold;background-color:#78F; width:400px; font-size:100%; padding:10px; border:2px solid black; margin:5px;' class='task' value='https://"+location.host+location.pathname+"?room="+session.roomid+passAdd+"' /><font style='font-size:110%;color:white;'><i class='las la-video' style='position:relative;top:7px;font-size:2em;' aria-hidden='true'></i> - <span data-translate='invite-users-to-join'>Invites users to join the group and broadcast their feed to it. These users will see every feed in the room.</span></font></div>";
|
||||
|
||||
gridlayout.innerHTML += "<br /><font style='font-size:130%;color:white;'></font><input class='task' onclick='popupMessage(event);copyFunction(this)' onmousedown='copyFunction(this)' style='cursor:grab;font-weight:bold;background-color:#F45;width:400px;font-size:100%;padding:10px;border:2px solid black;margin:5px;' value='https://"+location.host+location.pathname+"?room="+session.roomid+passAdd+"&view' /><font style='font-size:110%;color:white;'><i class='las la-video' style='position:relative;top:7px;font-size:2em;' aria-hidden='true'></i> - Link to Invite users to broadcast their feeds to the group. These users will not see or hear any feed from the group.</font><br />";
|
||||
gridlayout.innerHTML += "<br /><font style='font-size:130%;color:white;'></font><input class='task' onclick='popupMessage(event);copyFunction(this)' onmousedown='copyFunction(this)' style='cursor:grab;font-weight:bold;background-color:#F45;width:400px;font-size:100%;padding:10px;border:2px solid black;margin:5px;' value='https://"+location.host+location.pathname+"?room="+session.roomid+passAdd+"&view' /><font style='font-size:110%;color:white;'><i class='las la-video' style='position:relative;top:7px;font-size:2em;' aria-hidden='true'></i> - <span data-translate='link-to-invite-camera'>Link to invite users to broadcast their feeds to the group. These users will not see or hear any feed from the group.</span></font><br />";
|
||||
|
||||
|
||||
gridlayout.innerHTML += "<font style='font-size:130%;color:white'></font><input class='task' onmousedown='copyFunction(this)' data-drag='1' onclick='popupMessage(event);copyFunction(this)' style='cursor:grab;font-weight:bold;background-color:#5F4;width:400px;font-size:100%;padding:10px;border:2px solid black;margin:5px;' value='https://"+location.host+location.pathname+"?scene=1&room="+session.roomid+passAdd2+"' /><font style='font-size:110%;color:white'><i class='las la-th-large' style='position:relative;top:7px;font-size:2em;' aria-hidden='true'></i> - This is an OBS Browser Source link that contains the group chat in just a single scene. Videos must be added to Group Scene.</font><br />";
|
||||
gridlayout.innerHTML += "<font style='font-size:130%;color:white'></font><input class='task' onmousedown='copyFunction(this)' data-drag='1' onclick='popupMessage(event);copyFunction(this)' style='cursor:grab;font-weight:bold;background-color:#5F4;width:400px;font-size:100%;padding:10px;border:2px solid black;margin:5px;' value='https://"+location.host+location.pathname+"?scene=1&room="+session.roomid+passAdd2+"' /><font style='font-size:110%;color:white'><i class='las la-th-large' style='position:relative;top:7px;font-size:2em;' aria-hidden='true'></i> - <span data-translate='this-is-obs-browser-source-link'>This is an OBS Browser Source link that is empty by default. Videos in the room can be manually added to this scene.</span></font><br />";
|
||||
|
||||
gridlayout.innerHTML += '<button style="margin:10px;" onclick="toggle(getById(\'roomnotes2\'),this);">Click Here for a quick overview and help</button><br />';
|
||||
gridlayout.innerHTML += "<font style='font-size:130%;color:white'></font><input class='task' onmousedown='copyFunction(this)' data-drag='1' onclick='popupMessage(event);copyFunction(this)' style='cursor:grab;font-weight:bold;background-color:#7C7;width:400px;font-size:100%;padding:10px;border:2px solid black;margin:5px;' value='https://"+location.host+location.pathname+"?scene=0&room="+session.roomid+passAdd2+"' /><font style='font-size:110%;color:white'><i class='las la-th-large' style='position:relative;top:7px;font-size:2em;' aria-hidden='true'></i> - <span data-translate='this-is-obs-browser-souce-link-auto'>Also an OBS Browser Source link. All guest videos in this group chat room will automatically be added into this scene.</span></font><br />";
|
||||
|
||||
gridlayout.innerHTML += "<div id='roomnotes2' style='display:none;padding:0 0 0 10px;' ><br />\
|
||||
<font style='color:#CCC;'>Welcome. This is the control-room for the group-chat. There are different things you can use this room for:<br /><br />\
|
||||
<li>You can host a small-group chat here. Share the blue link to invite guests who will join the chat automatically.</li>\
|
||||
<li>You can use it to invite and manage up to ~20 remote camera streams. Use the red-colored add camera link to bring in such streams.</li>\
|
||||
<li>You can add and remote control individual streams loaded into OBS. The required solo-links to add to OBS will appear under videos as they load.</li>\
|
||||
<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\
|
||||
<li>You can use it to record video streams independently</li>\
|
||||
gridlayout.innerHTML += '<button data-translate="click-for-quick-room-overview" style="margin:10px;" onclick="toggle(getById(\'roomnotes2\'),this);">❔ Click Here for a quick overview and help</button> ';
|
||||
|
||||
|
||||
gridlayout.innerHTML += '<span id="miniPerformer"><button id="press2talk" style="margin:10px;" data-translate="push-to-talk-enable" onclick="press2talk(this);">🔊 Enable Director\'s Push-to-Talk Mode</button></span>';
|
||||
|
||||
gridlayout.innerHTML += "<br /><div id='roomnotes2' style='display:none;padding:0 0 0 10px;' ><br />\
|
||||
<font style='color:#CCC;' data-translate='welcome-to-control-room'>Welcome. This is the director's control-room for the group-chat. <br /><br />\
|
||||
<font style='color:red'>Known Limitations with Group Rooms:</font><br />\
|
||||
<li>iPhones and iPads <b>will not be visible to other guests</b>, but will appear to the director and inside OBS. <a target='_blank' href='https://www.reddit.com/r/OBSNinja/comments/iol981/obs_ninja_iphone/g4ekuqz/?utm_source=reddit&utm_medium=web2x&context=3'>Please see here for details.</a></li>\
|
||||
<li>A group room can handle around 4 to 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\
|
||||
<li>Videos will appear of low quality on purpose for just the guests and the director; this is to save bandwidth and CPU resources.</li>\
|
||||
<li>The state of the scenes, such as which videos are active in a scene, are lost when the director resets the control-room.</li>\
|
||||
<br />\
|
||||
As guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\
|
||||
<br />The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br /><Br />Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br /><br />\
|
||||
There are different things you can use this room for:<br /><br />\
|
||||
<li>You can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.</li>\
|
||||
<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\
|
||||
<li>You can use the auto-mixing Group Scenes, the green links, to auto arrange multiple videos for you in OBS.</li>\
|
||||
<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\
|
||||
<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\
|
||||
<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\
|
||||
<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\
|
||||
<br />\
|
||||
As guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to Group Scenes.\
|
||||
<br />The Group Scenes auto-mix videos into a layout. Please note that while Scene=1 is an Auto-Mixer, it requires videos be manually added to it; they will not appear automatically.<br /><br />\
|
||||
For advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a></font></div><hr />";
|
||||
|
||||
gridlayout.innerHTML += "<div id='deleteme'><br /><br /><center>\
|
||||
<div style='display:inline-block;width:300px;height:350px;border:2px solid white;background-color:#999;margin:40px;'><br /><br />GUEST SLOT #1<br /><br />(A video will appear here when a guest joins)<br /><br /><i class='las la-user ' style='font-size:8em;' aria-hidden='true'></i><br /><br />A Solo-Link for OBS will appear here.</div>\
|
||||
<div style='display:inline-block;width:300px;height:350px;border:2px solid white;background-color:#999;margin:40px;'><br /><br />GUEST SLOT #2<br /><br />(A video will appear here when a guest joins)<br /><br /><i class='las la-user ' style='font-size:8em;' aria-hidden='true'></i><br /><br />A Solo Link for OBS will appear here</div>\
|
||||
<div style='display:inline-block;width:300px;height:350px;border:2px solid white;background-color:#999;margin:40px;'><br /><br />GUEST SLOT #3<br /><br />(A video will appear here when a guest joins)<br /><br /><i class='las la-user ' style='font-size:8em;'aria-hidden='true'></i><br /><br />A Solo Link for OBS will appear here</div>\
|
||||
<div style='display:inline-block;width:300px;height:350px;border:2px solid white;background-color:#999;margin:40px;'><br /><br />GUEST SLOT #4<br /><br />(A video will appear here when a guest joins)<br /><br /><i class='las la-user ' style='font-size:8em;'aria-hidden='true'></i><br /><br />A Solo Link for OBS will appear here</div></center></div>";
|
||||
joinRoom(roomname); // setting this to limit bitrate may break things.
|
||||
<div style='display:inline-block;width:300px;height:350px;border:2px solid white;background-color:#999;margin:40px;'><br /><br />GUEST SLOT #1<br /><br /><span data-translate='guest-will-appaer-here-on-join'>(A video will appear here when a guest joins)</span><br /><br /><i class='las la-user ' style='font-size:8em;' aria-hidden='true'></i><br /><br />A Solo-Link for OBS will appear here.</div>\
|
||||
<div style='display:inline-block;width:300px;height:350px;border:2px solid white;background-color:#999;margin:40px;'><br /><br />GUEST SLOT #2<br /><br /><span data-translate='guest-will-appaer-here-on-join'>(A video will appear here when a guest joins)</span><br /><br /><i class='las la-user ' style='font-size:8em;' aria-hidden='true'></i><br /><br />A Solo Link for OBS will appear here</div>\
|
||||
<div style='display:inline-block;width:300px;height:350px;border:2px solid white;background-color:#999;margin:40px;'><br /><br />GUEST SLOT #3<br /><br /><span data-translate='guest-will-appaer-here-on-join'>(A video will appear here when a guest joins)</span><br /><br /><i class='las la-user ' style='font-size:8em;'aria-hidden='true'></i><br /><br />A Solo Link for OBS will appear here</div>\
|
||||
<div style='display:inline-block;width:300px;height:350px;border:2px solid white;background-color:#999;margin:40px;'><br /><br />GUEST SLOT #4<br /><br /><span data-translate='guest-will-appaer-here-on-join'>(A video will appear here when a guest joins)</span><br /><br /><i class='las la-user ' style='font-size:8em;'aria-hidden='true'></i><br /><br />A Solo Link for OBS will appear here</div></center></div>";
|
||||
joinRoom(roomname);
|
||||
|
||||
}
|
||||
|
||||
|
||||
function press2talk(ele){
|
||||
log(ele);
|
||||
ele.style.minWidth="127px";
|
||||
if (!(document.getElementById("videosource"))){
|
||||
ele.innerHTML = "🔴 Push to Mute";
|
||||
session.publishDirector();
|
||||
return;
|
||||
}
|
||||
if (ele.dataset.enabled=="false"){
|
||||
ele.innerHTML = "🔴 Push to Mute";
|
||||
ele.dataset.enabled="true";
|
||||
session.streamSrc.getAudioTracks().forEach((track) => {
|
||||
track.enabled = true;
|
||||
});
|
||||
log("PUSHED TO TALK 1");
|
||||
} else {
|
||||
ele.innerHTML = "🔇 Push to Talk ";
|
||||
ele.dataset.enabled="false";
|
||||
session.streamSrc.getAudioTracks().forEach((track) => {
|
||||
track.enabled = false;
|
||||
});
|
||||
log("PUSHED TO TALK 2");
|
||||
}
|
||||
}
|
||||
|
||||
function toggle(ele, tog=false) {
|
||||
var x = ele;
|
||||
if (x.style.display === "none") {
|
||||
@@ -2532,7 +2702,28 @@ function gotDevices2(deviceInfos){
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function playtone(screen=false){
|
||||
|
||||
if (screen){
|
||||
var outputSelect = document.querySelector('select#outputSourceScreenshare');
|
||||
session.sink = outputSelect.options[outputSelect.selectedIndex].value;
|
||||
}
|
||||
|
||||
var testtone= getById("testtone");
|
||||
if (testtone){
|
||||
if (session.sink){
|
||||
testtone.setSinkId(session.sink).then(() => {
|
||||
log("changing audio sink:"+session.sink);
|
||||
testtone.play();
|
||||
}).catch(error => {
|
||||
errolog("couldn't set sink");
|
||||
errorlog(error);
|
||||
});
|
||||
} else {
|
||||
testtone.play();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function getAudioOnly(selector, trackid=null){
|
||||
var audioSelect = document.querySelector(selector).querySelectorAll("input");
|
||||
@@ -2715,23 +2906,28 @@ async function grabScreen(quality=0, audio=true){
|
||||
session.streamSrc = getById(eleName).srcObject;
|
||||
|
||||
|
||||
|
||||
if (track.kind == "video"){
|
||||
toggleVideoMute(true);
|
||||
for (UUID in session.pcs){
|
||||
try {
|
||||
var senders = session.pcs[UUID].getSenders(); // for any connected peer, update the video they have if connected with a video already.
|
||||
var added=false;
|
||||
senders.forEach((sender) => { // I suppose there could be a race condition between negotiating and updating this. if joining at the same time as changnig streams?
|
||||
if (sender.track){
|
||||
if (sender.track.kind == "video"){
|
||||
sender.replaceTrack(track); // replace may not be supported by all browsers. eek.
|
||||
added=true;
|
||||
}
|
||||
if (((iOS) || (iPad)) && (session.pcs[UUID].guest==true)){
|
||||
warnlog("iOS and GUest detected");
|
||||
} else if ((session.pcs[UUID].guest==true) && (session.roombitrate===0)) {
|
||||
log("room rate restriction detected. No videos will be published to other guests");
|
||||
} else if (session.pcs[UUID].allowVideo==true){ // allow
|
||||
var senders = session.pcs[UUID].getSenders(); // for any connected peer, update the video they have if connected with a video already.
|
||||
var added=false;
|
||||
senders.forEach((sender) => { // I suppose there could be a race condition between negotiating and updating this. if joining at the same time as changnig streams?
|
||||
if (sender.track){
|
||||
if (sender.track.kind == "video"){
|
||||
sender.replaceTrack(track); // replace may not be supported by all browsers. eek.
|
||||
added=true;
|
||||
}
|
||||
}
|
||||
});
|
||||
if (added==false){
|
||||
session.pcs[UUID].addTrack(track, stream);
|
||||
}
|
||||
});
|
||||
if (added==false){
|
||||
session.pcs[UUID].addTrack(track, stream);
|
||||
}
|
||||
} catch (e){
|
||||
errorlog(e);
|
||||
@@ -2741,7 +2937,9 @@ async function grabScreen(quality=0, audio=true){
|
||||
toggleMute(true); // I might want to move this outside the loop, but whatever
|
||||
for (UUID in session.pcs){
|
||||
try {
|
||||
session.pcs[UUID].addTrack(track, stream);
|
||||
if (session.pcs[UUID].allowAudio==true){
|
||||
session.pcs[UUID].addTrack(track, stream);
|
||||
}
|
||||
} catch (e){
|
||||
errorlog(log);
|
||||
}
|
||||
@@ -2903,18 +3101,25 @@ async function grabVideo(quality=0, eleName='previewWebcam', selector="select#vi
|
||||
toggleVideoMute(true);
|
||||
for (UUID in session.pcs){
|
||||
try {
|
||||
var senders = session.pcs[UUID].getSenders(); // for any connected peer, update the video they have if connected with a video already.
|
||||
var added=false;
|
||||
senders.forEach((sender) => { // I suppose there could be a race condition between negotiating and updating this. if joining at the same time as changnig streams?
|
||||
if (sender.track){
|
||||
if (sender.track.kind == "video"){
|
||||
sender.replaceTrack(track); // replace may not be supported by all browsers. eek.
|
||||
added=true;
|
||||
if (((iOS) || (iPad)) && (session.pcs[UUID].guest==true)){
|
||||
warnlog("iOS and GUest detected");
|
||||
} else if ((session.pcs[UUID].guest==true) && (session.roombitrate===0)) {
|
||||
log("room rate restriction detected. No videos will be published to other guests");
|
||||
} else if (session.pcs[UUID].allowVideo==true){ // allow
|
||||
|
||||
var senders = session.pcs[UUID].getSenders(); // for any connected peer, update the video they have if connected with a video already.
|
||||
var added=false;
|
||||
senders.forEach((sender) => { // I suppose there could be a race condition between negotiating and updating this. if joining at the same time as changnig streams?
|
||||
if (sender.track){
|
||||
if (sender.track.kind == "video"){
|
||||
sender.replaceTrack(track); // replace may not be supported by all browsers. eek.
|
||||
added=true;
|
||||
}
|
||||
}
|
||||
});
|
||||
if (added==false){
|
||||
session.pcs[UUID].addTrack(track, stream); // can't replace, so adding
|
||||
}
|
||||
});
|
||||
if (added==false){
|
||||
session.pcs[UUID].addTrack(track, stream); // can't replace, so adding
|
||||
}
|
||||
|
||||
} catch (e){
|
||||
@@ -3062,8 +3267,10 @@ async function grabAudio(eleName="previewWebcam", selector="#audioSource", track
|
||||
toggleMute(true);
|
||||
|
||||
for (UUID in session.pcs){
|
||||
session.pcs[UUID].addTrack(track, streams[i]);
|
||||
//sender.replaceTrack(track);
|
||||
if (session.pcs[UUID].allowAudio==true){ // allow
|
||||
var sender = session.pcs[UUID].addTrack(track, streams[i]);
|
||||
//sender.track.onended = tryAgain;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -3083,7 +3290,89 @@ async function grabAudio(eleName="previewWebcam", selector="#audioSource", track
|
||||
gowebcam.innerHTML = "START";
|
||||
}
|
||||
}
|
||||
|
||||
var tryAgainTimer=null;
|
||||
function tryAgain(event){ // audio or video agnostic track reconnect
|
||||
warnlog(event.currentTarget);
|
||||
if (getById("videosource")==null){ // Don't bother with this if just a preview stream
|
||||
return;
|
||||
}
|
||||
|
||||
var deviceType = event.currentTarget.kind;
|
||||
var deviceId= event.currentTarget.id;
|
||||
|
||||
if (tryAgainTimer!=null){
|
||||
clearTimeout(tryAgainTimer);
|
||||
tryAgainTimer=null;
|
||||
}
|
||||
tryAgainTimer = setTimeout(function(){
|
||||
navigator.mediaDevices.ondevicechange = null; // we only give it 10-seconds to reconnect.
|
||||
},10000);
|
||||
|
||||
navigator.mediaDevices.ondevicechange = function(){
|
||||
clearTimeout(tryAgainTimer);
|
||||
tryAgainTimer=null;
|
||||
navigator.mediaDevices.ondevicechange=null; // clear
|
||||
|
||||
|
||||
if (deviceType=="audio"){
|
||||
if ((deviceId=="default") && (session.echoCancellation!==false) && (session.autoGainControl!==false) && (session.noiseSuppression!==false)){
|
||||
var constraint = {audio: true};
|
||||
} else {
|
||||
var constraint = {audio: {deviceId: {exact: deviceId}}};
|
||||
if (session.echoCancellation==false){
|
||||
constraint.audio.echoCancellation=false;
|
||||
}
|
||||
if (session.autoGainControl==false){
|
||||
constraint.audio.autoGainControl=false;
|
||||
}
|
||||
if (session.noiseSuppression==false){
|
||||
constraint.audio.noiseSuppression=false;
|
||||
}
|
||||
}
|
||||
constraint.video = false;
|
||||
} else if (deviceType=="video"){
|
||||
var constraint = {
|
||||
video: {deviceId: {exact: deviceId}},
|
||||
audio: false
|
||||
};
|
||||
} else {
|
||||
return; // no idea what this is? fail gently.
|
||||
}
|
||||
|
||||
warnlog(constraint);
|
||||
navigator.mediaDevices.getUserMedia(constraint).timeout(3000).then(function (stream){
|
||||
stream.getTracks().forEach(function(track){
|
||||
|
||||
getById("videosource").srcObject.addTrack(track, stream); // add video track to the preview video
|
||||
session.streamSrc = getById(eleName).srcObject;
|
||||
toggleMute(true);
|
||||
|
||||
for (UUID in session.pcs){
|
||||
if (session.pcs[UUID].allowAudio==true){ // allow
|
||||
var senders = session.pcs[UUID].getSenders(); // for any connected peer, update the video they have if connected with a video already.
|
||||
var added=false;
|
||||
senders.forEach((sender) => { // I suppose there could be a race condition between negotiating and updating this. if joining at the same time as changnig streams?
|
||||
if (sender.track){
|
||||
if (sender.track.id == track.id){
|
||||
added=true;
|
||||
warnlog(sender.track);
|
||||
if (sender.track.readyState=="ended"){
|
||||
sender.replaceTrack(track);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
if (added==false){
|
||||
sender = session.pcs[UUID].addTrack(track, stream);
|
||||
sender.track.onended = tryAgain;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}).catch(errorlog); // console error message only
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function enterPressed(event, callback){
|
||||
// Number 13 is the "Enter" key on the keyboard
|
||||
@@ -3246,6 +3535,7 @@ function setupWebcamSelection(stream=null){
|
||||
gowebcam.style.backgroundColor = "#DDDDDD";
|
||||
gowebcam.style.fontWeight="normal";
|
||||
gowebcam.innerHTML = "Waiting for Camera to load";
|
||||
gowebcam.dataset.translate='waiting-for-camera-to-load';
|
||||
}
|
||||
activatedPreview=false;
|
||||
grabAudio();
|
||||
@@ -3258,6 +3548,7 @@ function setupWebcamSelection(stream=null){
|
||||
gowebcam.style.backgroundColor = "#DDDDDD";
|
||||
gowebcam.style.fontWeight="normal";
|
||||
gowebcam.innerHTML = "Waiting for Camera to load";
|
||||
gowebcam.dataset.translate='waiting-for-camera-to-load';
|
||||
}
|
||||
warnlog("video source changed");
|
||||
|
||||
@@ -3274,11 +3565,11 @@ function setupWebcamSelection(stream=null){
|
||||
session.sink = outputSelect.options[outputSelect.selectedIndex].value;
|
||||
//if (session.sink=="default"){session.sink=false;} else {
|
||||
getById("previewWebcam").setSinkId(session.sink).then(() => {
|
||||
log("New Output Device:"+session.sink);
|
||||
}).catch(error => {
|
||||
errorlog(error);
|
||||
//setTimeout(function(){alert("Failed to change audio output destination.");},1);
|
||||
});
|
||||
log("New Output Device:"+session.sink);
|
||||
}).catch(error => {
|
||||
errorlog(error);
|
||||
//setTimeout(function(){alert("Failed to change audio output destination.");},1);
|
||||
});
|
||||
//}
|
||||
}
|
||||
|
||||
@@ -3289,6 +3580,7 @@ function setupWebcamSelection(stream=null){
|
||||
gowebcam.style.backgroundColor = "#DDDDDD";
|
||||
gowebcam.style.fontWeight="normal";
|
||||
gowebcam.innerHTML = "Waiting for Camera to load";
|
||||
gowebcam.dataset.translate='waiting-for-camera-to-load';
|
||||
}
|
||||
|
||||
if (parseInt(getById("webcamquality").elements.namedItem("resolution").value)==3){
|
||||
@@ -3313,6 +3605,7 @@ function setupWebcamSelection(stream=null){
|
||||
gowebcam.style.color = "black";
|
||||
gowebcam.style.fontWeight="bold";
|
||||
gowebcam.innerHTML = "START";
|
||||
gowebcam.dataset.translate='start';
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -3529,11 +3822,11 @@ function generateQRPage(){
|
||||
sendstr = 'https://' + location.host + location.pathname + '?push=' + sid + sendstr;
|
||||
viewstr = 'https://' + location.host+ location.pathname + '?view=' + sid + viewstr + title;
|
||||
|
||||
getById("gencontent").innerHTML = '<br /><div id="qrcode" style="background-color:white;display:inline-block;color:black;max-width:340px;padding:40px;"><h2 style="color:black">Guest Invite Link:</h2><input class="task" onclick="popupMessage(event);copyFunction(this)" onmousedown="copyFunction(this)" \
|
||||
getById("gencontent").innerHTML = '<br /><div id="qrcode" style="background-color:white;display:inline-block;color:black;max-width:340px;padding:40px;"><h2 style="color:black" data-translate="invite-link">Guest Invite Link:</h2><input class="task" onclick="popupMessage(event);copyFunction(this)" onmousedown="copyFunction(this)" \
|
||||
style="cursor:grab;background-color:#CFC;border: 2px solid black;width:260px;font-size:120%;padding:10px;" value="' + sendstr + '" /><br /><br /></div>\
|
||||
<br /><br />and don\'t forget the<h2 style="color:black">OBS Browser Source Link:</h2><input class="task" data-drag="1" onmousedown="copyFunction(this)" onclick="popupMessage(event);copyFunction(this)" style="cursor:grab;background-color:#FCC;width:400px;font-size:120%;padding:10px;border:2px solid black;margin:5px;" value="' + viewstr + '" /> \
|
||||
<br /><br />\
|
||||
Please also note, the invite link and OBS ingestion link created is reusable, but only one person may use a specific invite at a time.';
|
||||
<span data-translate="please-note-invite-ingestion-link">Please also note, the invite link and OBS ingestion link created is reusable, but only one person may use a specific invite at a time.</span>';
|
||||
var qrcode = new QRCode(getById("qrcode"), {
|
||||
width : 300,
|
||||
height : 300,
|
||||
@@ -3552,6 +3845,13 @@ function generateQRPage(){
|
||||
if (session.view){
|
||||
getById("main").className = "";
|
||||
getById("credits").style.display = 'none';
|
||||
try{
|
||||
if (document.title==""){
|
||||
document.title = "View="+session.view.toString();
|
||||
} else {
|
||||
document.title += ", View="+session.view.toString();
|
||||
}
|
||||
} catch(e){errorlog(e);};
|
||||
}
|
||||
|
||||
|
||||
@@ -3578,8 +3878,8 @@ if ((session.view) && (session.roomid===false)){
|
||||
if ((session.view) && (!(session.cleanOutput))){
|
||||
if (document.getElementById("mainmenu")){
|
||||
getById("mainmenu").style.backgroundImage = "url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHdpZHRoPSI0MHB4IiBoZWlnaHQ9IjQwcHgiIHZpZXdCb3g9IjAgMCA0MCA0MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEuNDE0MjE7IiB4PSIwcHgiIHk9IjBweCI+CiAgICA8ZGVmcz4KICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwogICAgICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgICAgICAgZnJvbSB7CiAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRvIHsKICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTM1OWRlZykKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQGtleWZyYW1lcyBzcGluIHsKICAgICAgICAgICAgICBmcm9tIHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRvIHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0zNTlkZWcpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHN2ZyB7CiAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7CiAgICAgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogc3BpbiAxLjVzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICAgICAgICAgIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBzcGluIDEuNXMgbGluZWFyIGluZmluaXRlOwogICAgICAgICAgICB9CiAgICAgICAgXV0+PC9zdHlsZT4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJvdXRlciI+CiAgICAgICAgPGc+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMCwwQzIyLjIwNTgsMCAyMy45OTM5LDEuNzg4MTMgMjMuOTkzOSwzLjk5MzlDMjMuOTkzOSw2LjE5OTY4IDIyLjIwNTgsNy45ODc4MSAyMCw3Ljk4NzgxQzE3Ljc5NDIsNy45ODc4MSAxNi4wMDYxLDYuMTk5NjggMTYuMDA2MSwzLjk5MzlDMTYuMDA2MSwxLjc4ODEzIDE3Ljc5NDIsMCAyMCwwWiIgc3R5bGU9ImZpbGw6YmxhY2s7Ii8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8cGF0aCBkPSJNNS44NTc4Niw1Ljg1Nzg2QzcuNDE3NTgsNC4yOTgxNSA5Ljk0NjM4LDQuMjk4MTUgMTEuNTA2MSw1Ljg1Nzg2QzEzLjA2NTgsNy40MTc1OCAxMy4wNjU4LDkuOTQ2MzggMTEuNTA2MSwxMS41MDYxQzkuOTQ2MzgsMTMuMDY1OCA3LjQxNzU4LDEzLjA2NTggNS44NTc4NiwxMS41MDYxQzQuMjk4MTUsOS45NDYzOCA0LjI5ODE1LDcuNDE3NTggNS44NTc4Niw1Ljg1Nzg2WiIgc3R5bGU9ImZpbGw6cmdiKDIxMCwyMTAsMjEwKTsiLz4KICAgICAgICA8L2c+CiAgICAgICAgPGc+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMCwzMi4wMTIyQzIyLjIwNTgsMzIuMDEyMiAyMy45OTM5LDMzLjgwMDMgMjMuOTkzOSwzNi4wMDYxQzIzLjk5MzksMzguMjExOSAyMi4yMDU4LDQwIDIwLDQwQzE3Ljc5NDIsNDAgMTYuMDA2MSwzOC4yMTE5IDE2LjAwNjEsMzYuMDA2MUMxNi4wMDYxLDMzLjgwMDMgMTcuNzk0MiwzMi4wMTIyIDIwLDMyLjAxMjJaIiBzdHlsZT0iZmlsbDpyZ2IoMTMwLDEzMCwxMzApOyIvPgogICAgICAgIDwvZz4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggZD0iTTI4LjQ5MzksMjguNDkzOUMzMC4wNTM2LDI2LjkzNDIgMzIuNTgyNCwyNi45MzQyIDM0LjE0MjEsMjguNDkzOUMzNS43MDE5LDMwLjA1MzYgMzUuNzAxOSwzMi41ODI0IDM0LjE0MjEsMzQuMTQyMUMzMi41ODI0LDM1LjcwMTkgMzAuMDUzNiwzNS43MDE5IDI4LjQ5MzksMzQuMTQyMUMyNi45MzQyLDMyLjU4MjQgMjYuOTM0MiwzMC4wNTM2IDI4LjQ5MzksMjguNDkzOVoiIHN0eWxlPSJmaWxsOnJnYigxMDEsMTAxLDEwMSk7Ii8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8cGF0aCBkPSJNMy45OTM5LDE2LjAwNjFDNi4xOTk2OCwxNi4wMDYxIDcuOTg3ODEsMTcuNzk0MiA3Ljk4NzgxLDIwQzcuOTg3ODEsMjIuMjA1OCA2LjE5OTY4LDIzLjk5MzkgMy45OTM5LDIzLjk5MzlDMS43ODgxMywyMy45OTM5IDAsMjIuMjA1OCAwLDIwQzAsMTcuNzk0MiAxLjc4ODEzLDE2LjAwNjEgMy45OTM5LDE2LjAwNjFaIiBzdHlsZT0iZmlsbDpyZ2IoMTg3LDE4NywxODcpOyIvPgogICAgICAgIDwvZz4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggZD0iTTUuODU3ODYsMjguNDkzOUM3LjQxNzU4LDI2LjkzNDIgOS45NDYzOCwyNi45MzQyIDExLjUwNjEsMjguNDkzOUMxMy4wNjU4LDMwLjA1MzYgMTMuMDY1OCwzMi41ODI0IDExLjUwNjEsMzQuMTQyMUM5Ljk0NjM4LDM1LjcwMTkgNy40MTc1OCwzNS43MDE5IDUuODU3ODYsMzQuMTQyMUM0LjI5ODE1LDMyLjU4MjQgNC4yOTgxNSwzMC4wNTM2IDUuODU3ODYsMjguNDkzOVoiIHN0eWxlPSJmaWxsOnJnYigxNjQsMTY0LDE2NCk7Ii8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8cGF0aCBkPSJNMzYuMDA2MSwxNi4wMDYxQzM4LjIxMTksMTYuMDA2MSA0MCwxNy43OTQyIDQwLDIwQzQwLDIyLjIwNTggMzguMjExOSwyMy45OTM5IDM2LjAwNjEsMjMuOTkzOUMzMy44MDAzLDIzLjk5MzkgMzIuMDEyMiwyMi4yMDU4IDMyLjAxMjIsMjBDMzIuMDEyMiwxNy43OTQyIDMzLjgwMDMsMTYuMDA2MSAzNi4wMDYxLDE2LjAwNjFaIiBzdHlsZT0iZmlsbDpyZ2IoNzQsNzQsNzQpOyIvPgogICAgICAgIDwvZz4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggZD0iTTI4LjQ5MzksNS44NTc4NkMzMC4wNTM2LDQuMjk4MTUgMzIuNTgyNCw0LjI5ODE1IDM0LjE0MjEsNS44NTc4NkMzNS43MDE5LDcuNDE3NTggMzUuNzAxOSw5Ljk0NjM4IDM0LjE0MjEsMTEuNTA2MUMzMi41ODI0LDEzLjA2NTggMzAuMDUzNiwxMy4wNjU4IDI4LjQ5MzksMTEuNTA2MUMyNi45MzQyLDkuOTQ2MzggMjYuOTM0Miw3LjQxNzU4IDI4LjQ5MzksNS44NTc4NloiIHN0eWxlPSJmaWxsOnJnYig1MCw1MCw1MCk7Ii8+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K')";
|
||||
getById("mainmenu").innerHTML = '<font style="color:#666"><h1>Attempting to load video stream.</h1></font>';
|
||||
getById("mainmenu").innerHTML += '<font style="color:#EEE">The stream is not available yet or an error occured.</font><br/><button onclick="location.reload();">Retry Manually</button><br/>';
|
||||
getById("mainmenu").innerHTML = '<font style="color:#666"><h1 data-translate="attempting-to-load">Attempting to load video stream.</h1></font>';
|
||||
getById("mainmenu").innerHTML += '<font style="color:#EEE" data-translate="stream-not-available-yet">The stream is not available yet or an error occured.</font><br/><button onclick="location.reload();" data-translate="try-manually">Retry Manually</button><br/>';
|
||||
|
||||
}}
|
||||
} catch(e){
|
||||
@@ -3600,6 +3900,15 @@ if ((session.view) && (session.roomid===false)){
|
||||
play();
|
||||
//getById("mainmenu").style.display="none";
|
||||
}
|
||||
} else if (session.roomid){
|
||||
try{
|
||||
if (document.title==""){
|
||||
document.title = "Room="+session.roomid.toString();
|
||||
} else {
|
||||
document.title += ", Room="+session.roomid.toString();
|
||||
}
|
||||
} catch(e){errorlog(e);};
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -4014,7 +4323,9 @@ function updateMessages(){
|
||||
|
||||
var time = timeSince(messageList[i].time);
|
||||
var msg = document.createElement("div");
|
||||
////// KEEP THIS IN /////////
|
||||
console.log(messageList[i].msg); // Display Recieved messages for View-Only clients.
|
||||
/////////////////////////////
|
||||
if (messageList[i].type == "sent"){
|
||||
msg.innerHTML = messageList[i].msg + " <i><small> <small>- "+time+"</small></small></i>";
|
||||
msg.classList.add("outMessage");
|
||||
|
||||
176
speedtest.html
Normal file
176
speedtest.html
Normal file
@@ -0,0 +1,176 @@
|
||||
<html>
|
||||
<head><title>OBSN Speed Test</title>
|
||||
<style>
|
||||
body{
|
||||
padding:0;
|
||||
margin:0;
|
||||
}
|
||||
iframe {
|
||||
border:0;
|
||||
margin:0;
|
||||
padding:0;
|
||||
display:inline-block;
|
||||
margin:0;
|
||||
width:100%;
|
||||
height:100%;
|
||||
}
|
||||
span {
|
||||
border:0;
|
||||
margin:0;
|
||||
padding:0;
|
||||
display:inline-block;
|
||||
margin:0;
|
||||
width:50%;
|
||||
height:45%;
|
||||
}
|
||||
#viewlink {
|
||||
width:400px;
|
||||
}
|
||||
#container {
|
||||
display:block;
|
||||
padding:0px;
|
||||
}
|
||||
input{
|
||||
padding:5px;
|
||||
margin:5px;
|
||||
}
|
||||
button{
|
||||
padding:5px;
|
||||
margin:5px;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
|
||||
(function (w) {
|
||||
w.URLSearchParams = w.URLSearchParams || function (searchString) {
|
||||
var self = this;
|
||||
self.searchString = searchString;
|
||||
self.get = function (name) {
|
||||
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(self.searchString);
|
||||
if (results == null) {
|
||||
return null;
|
||||
}
|
||||
else {
|
||||
return decodeURI(results[1]) || 0;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
})(window);
|
||||
var urlParams = new URLSearchParams(window.location.search);
|
||||
|
||||
|
||||
|
||||
function loadIframe(){
|
||||
|
||||
var streamID = "";
|
||||
var possible = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789";
|
||||
for (var i = 0; i < 7; i++){
|
||||
streamID += possible.charAt(Math.floor(Math.random() * possible.length));
|
||||
}
|
||||
|
||||
|
||||
var iframe = document.createElement("iframe");
|
||||
var iframeContainer = document.createElement("span");
|
||||
|
||||
iframe.allow="autoplay";
|
||||
var srcString = "./?push="+streamID+"&cleanoutput&privacy&audiodevice=0";
|
||||
|
||||
if (urlParams.has('turn')){
|
||||
iframe.src = srcString+"&turn="+urlParams.get("turn");
|
||||
} else {
|
||||
iframe.src = srcString;
|
||||
}
|
||||
|
||||
iframeContainer.appendChild(iframe);
|
||||
document.getElementById("container").appendChild(iframeContainer);
|
||||
|
||||
var iframe = document.createElement("iframe");
|
||||
var iframeContainer = document.createElement("span");
|
||||
|
||||
iframe.allow="autoplay";
|
||||
iframe.src = "./?view="+streamID+"&cleanoutput&privacy&noaudio";
|
||||
|
||||
iframeContainer.appendChild(iframe);
|
||||
document.getElementById("container").appendChild(iframeContainer);
|
||||
|
||||
var button = document.createElement("br");
|
||||
document.getElementById("container").appendChild(button);
|
||||
|
||||
var button = document.createElement("button");
|
||||
button.innerHTML = "Disconnect";
|
||||
button.onclick = function(){iframe.contentWindow.postMessage({"close":true}, '*');}
|
||||
document.getElementById("container").appendChild(button);
|
||||
|
||||
var button = document.createElement("button");
|
||||
button.innerHTML = "Low Bitrate";
|
||||
button.onclick = function(){iframe.contentWindow.postMessage({"bitrate":30}, '*');}
|
||||
document.getElementById("container").appendChild(button);
|
||||
|
||||
var button = document.createElement("button");
|
||||
button.innerHTML = "High Bitrate";
|
||||
button.onclick = function(){iframe.contentWindow.postMessage({"bitrate":6000}, '*');}
|
||||
document.getElementById("container").appendChild(button);
|
||||
|
||||
var button = document.createElement("button");
|
||||
button.innerHTML = "Default Bitrate";
|
||||
button.onclick = function(){iframe.contentWindow.postMessage({"bitrate":-1}, '*');}
|
||||
document.getElementById("container").appendChild(button);
|
||||
|
||||
setInterval(function(){iframe.contentWindow.postMessage({"getStats":true}, '*');},1000);
|
||||
|
||||
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
|
||||
var eventer = window[eventMethod];
|
||||
var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
|
||||
|
||||
eventer(messageEvent, function (e) {
|
||||
|
||||
if ("stats" in e.data){
|
||||
var out = "";
|
||||
|
||||
for (var streamID in e.data.stats.inbound_stats){
|
||||
out += printValues(e.data.stats.inbound_stats[streamID]);
|
||||
}
|
||||
if (out.split("Bitrate_in_kbps").length>1){
|
||||
document.getElementById("statsdiv").innerHTML = "<b>Bitrate_in_kbps</b>"+out.split("Bitrate_in_kbps")[1];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
function printValues( obj) {
|
||||
var out = "";
|
||||
for (var key in obj) {
|
||||
if (typeof obj[key] === "object") {
|
||||
out +="<br />";
|
||||
out += printValues(obj[key]);
|
||||
} else {
|
||||
if (key.startsWith("_")){} else {
|
||||
out +="<b>"+key+"</b>: "+obj[key]+"<br />";
|
||||
}
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body onload="loadIframe();">
|
||||
<div id="container">
|
||||
</div>
|
||||
<div style="width:48%;padding:0;margin:0;border:0;display:inline-block;">
|
||||
<h3>OBS.Ninja Speed Test - prototype version</h3>
|
||||
(Tests connection to TURN server and back)<br /><br />
|
||||
<li>1.Select your camera.</li>
|
||||
<li>2.Hit start</li>
|
||||
<li>3.Wait for the video to load side-by-side. *If it does not auto-load within 20s, refresh and try again.*</li>
|
||||
<li>4.Stats will load on the right-hand side of the page here. (or press CTRL + LeftClick on the new video to open stats that way)</li>
|
||||
<li>5.Bitrate_in_kbps, Buffer_Delay_in_ms, and packetLoss_percentage are important connection quality metrics</li>
|
||||
<li>6.Increase the video bitrate by pressing <i>High Bitrate</i>; it should approach 6000-kbps if the network allows.</li>
|
||||
</div>
|
||||
<div id="statsdiv" style="width:48%;padding:0;margin:0;border:0;display:inline-block;">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
28
supports.html
Normal file
28
supports.html
Normal file
@@ -0,0 +1,28 @@
|
||||
<html>
|
||||
<body>
|
||||
<pre id="json"><pre>
|
||||
|
||||
<script>
|
||||
var supports = navigator.mediaDevices.getSupportedConstraints();
|
||||
document.getElementById("json").innerHTML = "BROWSER SUPPORTED OPTIONS<HR>";
|
||||
document.getElementById("json").innerHTML += JSON.stringify(supports, undefined, 2);
|
||||
|
||||
|
||||
navigator.mediaDevices.getUserMedia({video: { facingMode: { ideal: "environment" }}, audio:false}).then(function(mediaStream){
|
||||
console.log("worked");
|
||||
|
||||
setTimeout(function(){
|
||||
mediaStream.getVideoTracks().forEach((track)=>{
|
||||
const capabilities = track.getCapabilities();
|
||||
const settings = track.getSettings();
|
||||
document.getElementById("json").innerHTML += "<HR>CAMERA SUPPORTED<HR>";
|
||||
document.getElementById("json").innerHTML += JSON.stringify(capabilities, undefined, 2);
|
||||
document.getElementById("json").innerHTML += "<HR>CAMERA SETTINGS <HR>";
|
||||
document.getElementById("json").innerHTML += JSON.stringify(settings, undefined, 2);
|
||||
});
|
||||
},1000);
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
82
template.js
82
template.js
@@ -1,82 +0,0 @@
|
||||
|
||||
/* We need to create dynamic keyframes to show the animation from full-screen to normal. So we create a stylesheet in which we can insert CSS keyframe rules */
|
||||
$("body").append('<style id="lightbox-animations" type="text/css"></style>');
|
||||
|
||||
/* Click on the container */
|
||||
$(".column").on('click', function() {
|
||||
/* The position of the container will be set to fixed, so set the top & left properties of the container */
|
||||
|
||||
var bounding_box = $(this).get(0).getBoundingClientRect();
|
||||
$(this).css({ top: bounding_box.top + 'px', left: bounding_box.left -20+ 'px' });
|
||||
|
||||
/* Set container to fixed position. Add animation */
|
||||
$(this).addClass('in-animation');
|
||||
|
||||
/* An empty container has to be added in place of the lightbox container so that the elements below don't come up
|
||||
Dimensions of this empty container is the same as the original container */
|
||||
$("#empty-container").remove();
|
||||
$('<div id="empty-container" class="column"></div>').insertAfter(this);
|
||||
|
||||
/* To animate the container from full-screen to normal, we need dynamic keyframes */
|
||||
var styles = '';
|
||||
styles = '@keyframes outlightbox {';
|
||||
styles += '0% {';
|
||||
styles += 'height: 100%;';
|
||||
styles += 'width: 100%;';
|
||||
styles += 'top: 0px;';
|
||||
styles += 'left: 0px;';
|
||||
styles += '}';
|
||||
styles += '50% {';
|
||||
styles += 'height: 220px;';
|
||||
styles += 'top: ' + bounding_box.y + 'px;';
|
||||
styles += '}';
|
||||
styles += '100% {';
|
||||
styles += 'height: 220px;';
|
||||
styles += 'width: '+bounding_box.width+'px;';
|
||||
styles += 'top: ' + bounding_box.y + 'px;';
|
||||
styles += 'left: ' + bounding_box.x + 'px;';
|
||||
styles += '}';
|
||||
styles += '}';
|
||||
|
||||
/* Add keyframe to CSS */
|
||||
$("#lightbox-animations").get(0).sheet.insertRule(styles, 0);
|
||||
|
||||
/* Hide the window scrollbar */
|
||||
$("body").css('overflow', 'hidden');
|
||||
});
|
||||
|
||||
/* Click on close button when full-screen */
|
||||
$(".close").on('click', function(e) {
|
||||
$(this).hide();
|
||||
$(".container-inner").hide();
|
||||
/* Window scrollbar normal */
|
||||
$("body").css('overflow', 'auto');
|
||||
|
||||
var bounding_box = $(this).parent().get(0).getBoundingClientRect();
|
||||
$(this).parent().css({ top: bounding_box.top + 'px', left: bounding_box.left + 'px' });
|
||||
|
||||
/* Show animation */
|
||||
$(this).parent().addClass('out-animation');
|
||||
|
||||
e.stopPropagation();
|
||||
});
|
||||
|
||||
/* On animationend : from normal to full screen & full screen to normal */
|
||||
$(".column").on('animationend', function(e) {
|
||||
/* On animation end from normal to full-screen */
|
||||
if(e.originalEvent.animationName == 'inlightbox') {
|
||||
$(this).children(".close").show();
|
||||
$(this).children(".container-inner").show();
|
||||
}
|
||||
/* On animation end from full-screen to normal */
|
||||
else if(e.originalEvent.animationName == 'outlightbox') {
|
||||
/* Remove fixed positioning, remove animation rules */
|
||||
$(this).removeClass('in-animation').removeClass('out-animation').removeClass('columnfade');
|
||||
|
||||
/* Remove the empty container that was earlier added */
|
||||
$("#empty-container").remove();
|
||||
|
||||
/* Delete the dynamic keyframe rule that was earlier created */
|
||||
$("#lightbox-animations").get(0).sheet.deleteRule(0);
|
||||
}
|
||||
});
|
||||
2
thirdparty/jquery.min.js
vendored
Normal file
2
thirdparty/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -47,5 +47,22 @@
|
||||
"invite-group-chat-type": "Dieser Gast..",
|
||||
"can-see-and-hear": "..kann den Gruppen-Chat sehen und hören",
|
||||
"can-hear-only": "..kann den Gruppen-Chat nur hören",
|
||||
"cant-see-or-hear": "..kann den Gruppen-chat weder hören noch sehen"
|
||||
}
|
||||
"cant-see-or-hear": "..kann den Gruppen-chat weder hören noch sehen",
|
||||
"password-input-field": "Password",
|
||||
"select-output-source": " Audio Output Destination: \n\t\t\t\t\t",
|
||||
"add-a-password-to-stream": " Add a password:",
|
||||
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome to OBS.Ninja! You can send text messages directly to connected peers from here.\n\t\t\t\t",
|
||||
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
|
||||
"send-chat": "Send",
|
||||
"available-languages": "Available Languages:",
|
||||
"add-more-here": "Add More Here!",
|
||||
"invite-users-to-join": "Invites users to join the group and broadcast their feed to it. These users will see every feed in the room.",
|
||||
"link-to-invite-camera": "Link to invite users to broadcast their feeds to the group. These users will not see or hear any feed from the group.",
|
||||
"this-is-obs-browser-source-link": "This is an OBS Browser Source link that is empty by default. Videos in the room can be manually added to this scene.",
|
||||
"this-is-obs-browser-souce-link-auto": "Also an OBS Browser Source link. All guest videos in this group chat room will automatically be added into this scene.",
|
||||
"click-for-quick-room-overview": "❔ Click Here for a quick overview and help",
|
||||
"push-to-talk-enable": "🔊 Enable Director's Push-to-Talk Mode",
|
||||
"welcome-to-control-room": "Welcome. This is the control-room for the group-chat. There are different things you can use this room for:<br><br>\t<li>You can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.</li>\t<li>A group room can handle around 4 to 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\t<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\t<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\t<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\t<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\t<br>\tAs guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\t<br>The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br><br>Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br><br>\tFor advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a>",
|
||||
"guest-will-appaer-here-on-join": "(A video will appear here when a guest joins)",
|
||||
"SOLO-LINK": "SOLO LINK for OBS:"
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
{
|
||||
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
|
||||
"GO": "GO",
|
||||
"copy-this-url": "Copy this URL into an OBS \"Browser Source\"",
|
||||
"you-are-in-the-control-center": "You are in the room's control center",
|
||||
"joining-room": "You are joining room",
|
||||
"add-group-chat": "Add Group Chat to OBS",
|
||||
"rooms-allow-for": "Rooms allow for simplified group-chat and the advanced management of multiple streams at once.",
|
||||
"room-name": "Room Name",
|
||||
"enter-the-rooms-control": "Enter the Room's Control Center",
|
||||
"show-tips": "Show me some tips..",
|
||||
"added-notes": "\n<u><i>Added Notes:</i></u>\n<li>Anyone can enter a room if they know the name, so keep it unique</li>\n<li>Invite only guests to the room you trust.</li>\n<li>iOS devices will share just their audio with other guests; this is mainly a hardware limitation</li>\n<li>The \"Recording\" option is considered experimental.</li>\n",
|
||||
"back": "Back",
|
||||
"add-your-camera": "Add your Camera to OBS",
|
||||
"waiting-for-camera": "Waiting for Camera to Load",
|
||||
"video-source": "Video source",
|
||||
"max-resolution": "1080p (hi-def)",
|
||||
"balanced": "720p (balanced)",
|
||||
"smooth-cool": "360p (smooth)",
|
||||
"select-audio-source": "Select Audio Source",
|
||||
"no-audio": "No Audio",
|
||||
"remote-screenshare-obs": "Remote Screenshare into OBS",
|
||||
"note-share-audio": "\n<b>note</b>: Do not forget to click \"Share audio\" in Chrome.<br>(Firefox does not support audio sharing.)",
|
||||
"select-screen-to-share": "SELECT SCREEN TO SHARE",
|
||||
"audio-sources": "Audio Sources",
|
||||
"create-reusable-invite": "Create Reusable Invite",
|
||||
"here-you-can-pre-generate": "Here you can pre-generate a reusable Browser Source link and a related guest invite link.",
|
||||
"generate-invite-link": "GENERATE THE INVITE LINK",
|
||||
"advanced-paramaters": "Advanced Options:",
|
||||
"unlock-video-bitrate": "Unlock Video Bitrate (20mbps)",
|
||||
"force-vp9-video-codec": "Force VP9 Video Codec (less artifacting)",
|
||||
"enable-stereo-and-pro": "Enable Stereo and Pro HD Audio",
|
||||
"video-resolution": "Video Resolution: ",
|
||||
"high-security-mode": "High Security Mode",
|
||||
"hide-screen-share": "Hide Screenshare Option",
|
||||
"allow-remote-control": "Remote Control Camera Zoom (android)",
|
||||
"add-the-guest-to-a-room": " Add the guest to a room:",
|
||||
"invite-group-chat-type": "This room guest can:",
|
||||
"can-see-and-hear": "Can see and hear the group chat",
|
||||
"can-hear-only": "Can only hear the group chat",
|
||||
"cant-see-or-hear": "Cannot hear or see the group chat",
|
||||
"info-blob": "\n<h2>What is OBS.Ninja</h2><br>\n<li>100% <b>free</b>; no downloads; no personal data collection; no sign-in</li>\n<li>Bring video from your smartphone, computer, or friends directly into your OBS video stream</li>\n<li>We use cutting edge Peer-to-Peer forwarding technology that offers privacy and ultra-low latency</li>\n<br>\n<li>Youtube video <i class=\"fa fa-youtube-play\" aria-hidden=\"true\"></i> <a href=\"https://www.youtube.com/watch?v=6R_sQKxFAhg\">Demoing it here</a> </li>\n<br>\n<i><font style=\"color:red\">Known issues:</font></i><br>\n<li><i class=\"fa fa-apple\" aria-hidden=\"true\"></i> <a href=\"https://github.com/steveseguin/obsninja/wiki/FAQ#mac-os\">MacOS users</a> need to use OBS v23 or resort to <a href=\"https://github.com/steveseguin/electroncapture\">Window Capturing</a> a browser with OBS v25</li>\n<li>Some users will have <a href=\"https://github.com/steveseguin/obsninja/wiki/FAQ#video-is-pixelated\">\"pixelation\" problems</a> with videos. Adding <b>&codec=vp9</b> to the OBS links will often correct it.</li>\n<br>\n",
|
||||
"remote-control-for-obs": "Remote Control for OBS",
|
||||
"add-to-group": "Add to Group Scene",
|
||||
"mute": "Mute",
|
||||
"record": "Record",
|
||||
"volume": "Volume",
|
||||
"open-in-new-tab": "Open in new Tab",
|
||||
"copy-to-clipboard": "Copy to Clipboard"
|
||||
}
|
||||
@@ -47,5 +47,22 @@
|
||||
"invite-group-chat-type": "This room guest can:",
|
||||
"can-see-and-hear": "Can see and hear the group chat",
|
||||
"can-hear-only": "Can only hear the group chat",
|
||||
"cant-see-or-hear": "Cannot hear or see the group chat"
|
||||
"cant-see-or-hear": "Cannot hear or see the group chat",
|
||||
"password-input-field": "Password",
|
||||
"select-output-source": " Audio Output Destination: \n\t\t\t\t\t",
|
||||
"add-a-password-to-stream": " Add a password:",
|
||||
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome to OBS.Ninja! You can send text messages directly to connected peers from here.\n\t\t\t\t",
|
||||
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
|
||||
"send-chat": "Send",
|
||||
"available-languages": "Available Languages:",
|
||||
"add-more-here": "Add More Here!",
|
||||
"invite-users-to-join": "Invites users to join the group and broadcast their feed to it. These users will see every feed in the room.",
|
||||
"link-to-invite-camera": "Link to invite users to broadcast their feeds to the group. These users will not see or hear any feed from the group.",
|
||||
"this-is-obs-browser-source-link": "This is an OBS Browser Source link that is empty by default. Videos in the room can be manually added to this scene.",
|
||||
"this-is-obs-browser-souce-link-auto": "Also an OBS Browser Source link. All guest videos in this group chat room will automatically be added into this scene.",
|
||||
"click-for-quick-room-overview": "❔ Click Here for a quick overview and help",
|
||||
"push-to-talk-enable": "🔊 Enable Director's Push-to-Talk Mode",
|
||||
"welcome-to-control-room": "Welcome. This is the control-room for the group-chat. There are different things you can use this room for:<br><br>\t<li>You can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.</li>\t<li>A group room can handle around 4 to 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\t<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\t<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\t<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\t<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\t<br>\tAs guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\t<br>The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br><br>Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br><br>\tFor advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a>",
|
||||
"guest-will-appaer-here-on-join": "(A video will appear here when a guest joins)",
|
||||
"SOLO-LINK": "SOLO LINK for OBS:"
|
||||
}
|
||||
@@ -1,51 +1,68 @@
|
||||
{
|
||||
"GO": "VAMOS",
|
||||
"add-group-chat": "Agregar grupo de chat a OBS",
|
||||
"add-to-group": "Agregar a la escena de grupo",
|
||||
"add-your-camera": "Agregar tu camara a OBS",
|
||||
"added-notes": "\n\t\t\t\t<u><i>Notas agregadas:</i></u>\n\t\t\t\t<li>cualquiera puede entrar en una sala si sabe el nombre, así que mantenlo único</li>\n\t\t\t\t<li>Tener más de quatro (4) personas en una sala no es recomendable debido a razones de rendimiento, pero depende de tú hardware.</li>\n\t\t\t\t<li>iOS dispositivos están limitados a tamaño de grupos de no más de dos (2) personas. Esto es una limitación de hardware.</li>\n\t\t\t\t<li>La opción de \"grabación\" es nueva y es considerada experimental.</li>\n\t\t\t\t<li>Tienes que \"Añadir\" una alimentación de video a la \"escena de grupo\" para que aparezca allí.</li>\n\t\t\t\t<li>Hay un botón nuevo añadido \"pantalla completa mejorada\" a la vista de invitados.</li>\n\t\t\t\t",
|
||||
"advanced-paramaters": "Parámetros Avanzados",
|
||||
"audio-sources": "Fuentes de Audio",
|
||||
"back": "Vuelta",
|
||||
"balanced": "Equilibrado",
|
||||
"copy-this-url": "Copia este URL a un OBS \"fuente del navegador\"",
|
||||
"copy-to-clipboard": "Copia a portapapeles",
|
||||
"create-reusable-invite": "Crear una invitación reusable",
|
||||
"enable-stereo-and-pro": "Habilitar el Estereo and Pro HD Audio",
|
||||
"enter-the-rooms-control": "Entrar la sala del centro de control",
|
||||
"force-vp9-video-codec": "Fuerza VP9 Video Codec (menos deformación)",
|
||||
"generate-invite-link": "GENERAR EL LINK DE INVITACIÓN",
|
||||
"here-you-can-pre-generate": "Aquí puedes pregenerar un enlace de fuente de navegador reutilizable y un enlace invitación correspondiente para invitados.",
|
||||
"high-security-mode": "Modo de alta seguridad",
|
||||
"info-blob": "\n\t\t\t\t\t\t<h2>Qué es OBS.Ninja</h2><br>\n\t\t\t\t\t\t<li>100% <b>gratis</b>; sin descargas; sin recopilación de datos personales; sin registración</li>\n\t\t\t\t\t\t<li>Trae video desde el móbil, ordenador portátil, ordenador, o de tus amigos directamente al video OBS stream</li>\n\t\t\t\t\t\t<li>Uitlizamos tecnologia innovadora Peer-to-Peer que ofrece privacidad y ultra baja latencia</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<li>Youtube video <i class=\"fa fa-youtube-play\" aria-hidden=\"true\"></i> <a href=\"https://www.youtube.com/watch?v=6R_sQKxFAhg\">Demo aquí</a> </li>\n\t\t\t\t\t\t<li>Codigo está disponible aquí: <i class=\"fa fa-github\" aria-hidden=\"true\"></i> <a href=\"https://github.com/steveseguin/obsninja\">https://github.com/steveseguin/obsninja</a> </li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<i><font style=\"color:red\">Problemas conocidos:</font></i><br>\n\n\t\t\t\t\t\t<li><i class=\"fa fa-apple\" aria-hidden=\"true\"></i> MacOS usuarios necesitan utilizar OBS v23 or recurrir a i>Captura de Window</i> un navegador Chrome con OBS v25</li>\n\t\t\t\t\t\t<li>Algunos usuarios tenrdán \"pixelación\" problemas con videos. Porfavor añadir el parametro URL <b>&codec=vp9</b> al enlace OBS para corregirlo.</li>\n\t<h3><i>Revisa <a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a> <i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"></i> para ayuda e información avanzada. También estoy en <a href=\"https://discord.gg/EksyhGA\">Discord</a> y puedes enviarme un email a steve@seguin.email</i></h3>\n\t\t\t\t\t",
|
||||
"joining-room": "Estás entrado en la sala",
|
||||
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
|
||||
"max-resolution": "Max Resolución",
|
||||
"mute": "Mudo",
|
||||
"no-audio": "Sin Audio",
|
||||
"note-share-audio": "\n\t\t\t\t\t<b>Nota</b>: No te olvides de hacer clic \"Compartir audio\" en cromo.<br>(Firefox no soporta compartir audio.)",
|
||||
"open-in-new-tab": "Abrir en un tab nuevo",
|
||||
"record": "Record",
|
||||
"remote-control-for-obs": "Control remoto para OBS",
|
||||
"remote-screenshare-obs": "Compartir pantalla remota en OBS",
|
||||
"room-name": "Nombre de sala",
|
||||
"rooms-allow-for": "Salas permiten grupos de chats simplificados y gestión avanzada de múltiples flujos a la vez.",
|
||||
"select-audio-source": "Seleccionar fuentes de Audio",
|
||||
"select-audio-video": "Seleccionar fuentes de audio/video source abajo",
|
||||
"select-screen-to-share": "SELECCIONAR PANTALLA PARA COMPARTIR",
|
||||
"show-tips": "Muestrame algunos consejos..",
|
||||
"smooth-cool": "Suave y fresco",
|
||||
"unlock-video-bitrate": "Unlock Video Bitrate (20mbps)",
|
||||
"video-source": "Fuente de video",
|
||||
"volume": "Volumen",
|
||||
"you-are-in-the-control-center": "Te encuentras in la sala de control",
|
||||
"waiting-for-camera": "Esperando a que se carge la camara",
|
||||
"video-resolution": "Video Resolución: ",
|
||||
"hide-screen-share": "Esconder opción compartir pantalla",
|
||||
"allow-remote-control": "Control remoto Camara Zoom (android)",
|
||||
"add-the-guest-to-a-room": " Añadir el invitado a una sala:",
|
||||
"invite-group-chat-type": "Este invitado a la sala puede:",
|
||||
"can-see-and-hear": "Puede ver y oir el chat de grupo",
|
||||
"can-hear-only": "Sólo puede oir el chat de grupo",
|
||||
"cant-see-or-hear": "No puede ni oir ni ver el chat de grupo"
|
||||
}
|
||||
{
|
||||
"GO": "IR",
|
||||
"add-group-chat": "Agregar grupo de chat a OBS",
|
||||
"add-to-group": "Agregar a la escena de grupo",
|
||||
"add-your-camera": "Agregar tu camara a OBS",
|
||||
"added-notes": "\n\t\t\t\t<u><i>Notas adicionales:</i></u>\n\t\t\t\t<li>Cualquiera puede entrar en una sala si conoce el nombre, así que mantenlo único</li>\n\t\t\t\t<li>Tener más de cuatro (4) personas en una sala no es recomendable debido a razones de rendimiento, pero depende de tu hardware.</li>\n\t\t\t\t<li>Los dispositivos iOS están limitados a tamaños de grupo de no más de dos (2) personas. Esto es una limitación de hardware.</li>\n\t\t\t\t<li>La opción de \"Grabación\" es nueva y se considera experimental.</li>\n\t\t\t\t<li>Tienes que \"Añadir\" una señal de video a la \"Escena de grupo\" para que aparezca allí.</li>\n\t\t\t\t<li>Hay un botón nuevo añadido \"Pantalla completa mejorada\" a la vista de invitados.</li>\n\t\t\t\t",
|
||||
"advanced-paramaters": "Parámetros Avanzados",
|
||||
"audio-sources": "Fuentes de Audio",
|
||||
"back": "Atrás",
|
||||
"balanced": "Equilibrado",
|
||||
"copy-this-url": "Copia esta URL a una fuente \"Navegador\" de OBS",
|
||||
"copy-to-clipboard": "Copia al portapapeles",
|
||||
"create-reusable-invite": "Crear una invitación reutilizable",
|
||||
"enable-stereo-and-pro": "Habilitar Estéreo y Pro HD Audio",
|
||||
"enter-the-rooms-control": "Entrar a la sala de centro de control",
|
||||
"force-vp9-video-codec": "Forzar VP9 Video Codec (menos artefactos)",
|
||||
"generate-invite-link": "GENERAR EL LINK DE INVITACIÓN",
|
||||
"here-you-can-pre-generate": "Aquí puedes pregenerar un enlace reutilizable para la fuente de navegador y un enlace para invitados.",
|
||||
"high-security-mode": "Modo de alta seguridad",
|
||||
"info-blob": "\n\t\t\t\t\t\t<h2>Qué es OBS.Ninja</h2><br>\n\t\t\t\t\t\t<li>100% <b>gratis</b>; sin descargas; sin recopilación de datos personales; sin registros</li>\n\t\t\t\t\t\t<li>Lleva video desde tu móbil, portátil, ordenador de sobremesa, o de tus amigos directamente a tu stream en OBS</li>\n\t\t\t\t\t\t<li>Utilizamos tecnología innovadora Peer-to-Peer que ofrece privacidad y ultra baja latencia</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<li>Youtube video <i class=\"fa fa-youtube-play\" aria-hidden=\"true\"></i> <a href=\"https://www.youtube.com/watch?v=6R_sQKxFAhg\">Demo aquí</a> </li>\n\t\t\t\t\t\t<li>El cdigo está disponible aquí: <i class=\"fa fa-github\" aria-hidden=\"true\"></i> <a href=\"https://github.com/steveseguin/obsninja\">https://github.com/steveseguin/obsninja</a> </li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<i><font style=\"color:red\">Problemas conocidos:</font></i><br>\n\n\t\t\t\t\t\t<li><i class=\"fa fa-apple\" aria-hidden=\"true\"></i> Los usuarios de MacOS necesitan utilizar OBS v23 o recurrir a i>Capturar ventana de un navegador Chrome con OBS v25</li>\n\t\t\t\t\t\t<li>Algunos usuarios tendrán problemas de \"pixelación\" con videos. Por favor añade en la URL el parametro <b>&codec=vp9</b> a los enlaces de OBS para corregirlo.</li>\n\t<h3><i>Revisa <a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a> <i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"></i> para ayuda e información avanzada. También estoy en <a href=\"https://discord.gg/EksyhGA\">Discord</a> y puedes enviarme un email a steve@seguin.email</i></h3>\n\t\t\t\t\t",
|
||||
"joining-room": "Estás entrado en la sala",
|
||||
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
|
||||
"max-resolution": "Max. Resolución",
|
||||
"mute": "Silenciar",
|
||||
"no-audio": "Sin Audio",
|
||||
"note-share-audio": "\n\t\t\t\t\t<b>Nota</b>: No te olvides de hacer clic \"Compartir audio\" en Chrome.<br>(Firefox no soporta compartir audio.)",
|
||||
"open-in-new-tab": "Abrir en una pestaña nueva",
|
||||
"record": "Grabar",
|
||||
"remote-control-for-obs": "Control remoto para OBS",
|
||||
"remote-screenshare-obs": "Compartir pantalla remota en OBS",
|
||||
"room-name": "Nombre de sala",
|
||||
"rooms-allow-for": "Las salas permiten un chat grupal simplificado y la administración avanzada de múltiples transmisiones a la vez.",
|
||||
"select-audio-source": "Seleccionar fuentes de audio",
|
||||
"select-audio-video": "Selecciona la fuente de audio/video a continuación",
|
||||
"select-screen-to-share": "SELECCIONAR PANTALLA PARA COMPARTIR",
|
||||
"show-tips": "Muéstrame algunos consejos..",
|
||||
"smooth-cool": "Fluido",
|
||||
"unlock-video-bitrate": "Desbloquear Video Bitrate (20mbps)",
|
||||
"video-source": "Fuente de video",
|
||||
"volume": "Volumen",
|
||||
"you-are-in-the-control-center": "Estás en la sala de centro de control",
|
||||
"waiting-for-camera": "Esperando a que se cargue la cámara",
|
||||
"video-resolution": "Resolución de vídeo: ",
|
||||
"hide-screen-share": "Ocultar opción compartir pantalla",
|
||||
"allow-remote-control": "Control remoto del zoom de la cámara (android)",
|
||||
"add-the-guest-to-a-room": " Añadir al invitado a una sala:",
|
||||
"invite-group-chat-type": "Este invitado a la sala puede:",
|
||||
"can-see-and-hear": "Puede ver y oir el chat de grupo",
|
||||
"can-hear-only": "Sólo puede oir el chat de grupo",
|
||||
"cant-see-or-hear": "No puede ni oir ni ver el chat de grupo",
|
||||
"password-input-field": "Password",
|
||||
"select-output-source": " Destino de la salida de audio: \n\t\t\t\t\t",
|
||||
"add-a-password-to-stream": " Añadir un password:",
|
||||
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tBienvenido a OBS.Ninja! Puedes enviar mensajes de texto directamente a compañeros conectados desde aquí.\n\t\t\t\t",
|
||||
"names-and-labels-coming-soon": "\n\t\t\t\t\tNombres identificando a los compañeros conectados serán una nueva característica en una próxima versión.\n\t\t\t\t",
|
||||
"send-chat": "Enviar",
|
||||
"available-languages": "Idiomas disponibles:",
|
||||
"add-more-here": "¡Añade más aquí!",
|
||||
"invite-users-to-join": "Invita a los usuarios a unirse al grupo y transmitir sus señales. Estos usuarios verán todas las señales de la sala.",
|
||||
"link-to-invite-camera": "Enlace para invitar a los usuarios a transmitir sus señales al grupo. Estos usuarios no verán ni escucharán ninguna señal del grupo.",
|
||||
"this-is-obs-browser-source-link": "Este es un enlace de una fuente de navegador de OBS que está vacía por defecto. Los videos de la sala se pueden agregar manualmente a esta escena.",
|
||||
"this-is-obs-browser-souce-link-auto": "También un enlace de fuente de navegador de OBS. Todos los videos de invitados en esta sala de chat grupal se agregarán automáticamente a esta escena.",
|
||||
"click-for-quick-room-overview": "❔ Haz clic aquí para obtener información general rápida y ayuda",
|
||||
"push-to-talk-enable": "🔊 Habilitar pulsar para hablar en el modo director",
|
||||
"welcome-to-control-room": "Bienvenidos. Esta es la sala de control para el chat grupal. Hay diferentes cosas para las que puedes usar esta habitación:<br><br>\t<li>Puedes organizar un chat grupal con amigos usando una sala. Comparte el enlace azul para invitar a los que se unirán al chat automáticamente.</li>\t<li>Una sala de grupo puede manejar de 4 a 30 invitados, dependiendo de numerosos factores, incluida la CPU y el ancho de banda disponible de todos los invitados en la sala.</li>\t<li>Las vistas individuales de cada vídeo se ofrecen según los videos se van cargando. Estos se pueden usar dentro de una fuente de navegador de OBS.</li>\t<li>Puedes usar la escena de grupo de mezcla automática, el enlace verde, para organizar automáticamente varios videos en OBS.</li>\t<li>Puedes usar esta sala de control para grabar transmisiones de vídeo o audio aisladas, pero es una característica experimental.</li>\t<li>Los videos en la sala del Director serán de baja calidad; para ahorrar ancho de banda/CPU</li>\t<li>Los invitados en la sala verán los videos de los demás con una calidad muy limitada para ahorrar ancho de banda/CPU.</li>\t<li>OBS verá el video de un invitado en alta calidad; la bitrate predeterminado es 2500 kbps.</li>\t<br>\tA medida que los invitados se unen, sus videos aparecerán a continuación. Puedes llevar sus transmisiones de vídeo a OBS como escenas individuales o puedes agregarlas a la escena de grupo.\t<br>La escena de grupo mezcla automáticamente los videos que se han agregado a la escena. Ten en cuenta que el Auto-Mixer requiere que los invitados se agreguen manualmente para que aparezcan en él; no se agregan automáticamente.<br><br>Los dispositivos móviles de Apple, como iPhones y iPads, no son totalmente compatibles con el videochat de grupo. Esta es una restricción de hardware.<br><br>\tPara opciones y parámetros avanzados, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">ver la Wiki.</a>",
|
||||
"guest-will-appaer-here-on-join": "(Aparecerá un video aquí cuando un invitado se una)",
|
||||
"SOLO-LINK": "SOLO LINK para OBS:"
|
||||
}
|
||||
|
||||
@@ -47,5 +47,22 @@
|
||||
"invite-group-chat-type": "This room guest can:",
|
||||
"can-see-and-hear": "Can see and hear the group chat",
|
||||
"can-hear-only": "Can only hear the group chat",
|
||||
"cant-see-or-hear": "Cannot hear or see the group chat"
|
||||
"cant-see-or-hear": "Cannot hear or see the group chat",
|
||||
"password-input-field": "Password",
|
||||
"select-output-source": " Audio Output Destination: \n\t\t\t\t\t",
|
||||
"add-a-password-to-stream": " Add a password:",
|
||||
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome to OBS.Ninja! You can send text messages directly to connected peers from here.\n\t\t\t\t",
|
||||
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
|
||||
"send-chat": "Send",
|
||||
"available-languages": "Available Languages:",
|
||||
"add-more-here": "Add More Here!",
|
||||
"invite-users-to-join": "Invites users to join the group and broadcast their feed to it. These users will see every feed in the room.",
|
||||
"link-to-invite-camera": "Link to invite users to broadcast their feeds to the group. These users will not see or hear any feed from the group.",
|
||||
"this-is-obs-browser-source-link": "This is an OBS Browser Source link that is empty by default. Videos in the room can be manually added to this scene.",
|
||||
"this-is-obs-browser-souce-link-auto": "Also an OBS Browser Source link. All guest videos in this group chat room will automatically be added into this scene.",
|
||||
"click-for-quick-room-overview": "❔ Click Here for a quick overview and help",
|
||||
"push-to-talk-enable": "🔊 Enable Director's Push-to-Talk Mode",
|
||||
"welcome-to-control-room": "Welcome. This is the control-room for the group-chat. There are different things you can use this room for:<br><br>\t<li>You can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.</li>\t<li>A group room can handle around 4 to 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\t<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\t<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\t<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\t<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\t<br>\tAs guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\t<br>The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br><br>Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br><br>\tFor advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a>",
|
||||
"guest-will-appaer-here-on-join": "(A video will appear here when a guest joins)",
|
||||
"SOLO-LINK": "SOLO LINK for OBS:"
|
||||
}
|
||||
@@ -20,12 +20,12 @@
|
||||
"select-audio-source": "Seleziona sorgente audio",
|
||||
"no-audio": "No Audio",
|
||||
"remote-screenshare-obs": "Screenshare remoto dentro OBS",
|
||||
"note-share-audio": "\n<b>note</b>: Do not forget to click \"Share audio\" in Chrome.<br>(Firefox does not support audio sharing.)",
|
||||
"note-share-audio": "\n<b>note</b>: Do not forget to click \"Condividi audio\" in Chrome.<br>(Firefox non supporta la condivisione dell'audio..)",
|
||||
"select-screen-to-share": "Seleziona lo schermo da condividere",
|
||||
"audio-sources": "Sorgenti Audio",
|
||||
"create-reusable-invite": "Crea un invito riutilizzabile",
|
||||
"here-you-can-pre-generate": "Qui è possibile pre-generare un collegamento Sorgente del browser riutilizzabile e un collegamento di invito ospite correlato.",
|
||||
"generate-invite-link": "GENERATE THE INVITE LINK",
|
||||
"generate-invite-link": "Genera Link invito",
|
||||
"advanced-paramaters": "Opzioni avanzate:",
|
||||
"unlock-video-bitrate": "Sblocca Video Bitrate (20mbps)",
|
||||
"force-vp9-video-codec": "Forza VP9 Video Codec (less artifacting)",
|
||||
@@ -46,5 +46,22 @@
|
||||
"record": "Registra",
|
||||
"volume": "Volume",
|
||||
"open-in-new-tab": "Apri in una nuova Tab",
|
||||
"copy-to-clipboard": "Copia negli appunti"
|
||||
"copy-to-clipboard": "Copia negli appunti",
|
||||
"password-input-field": "Password",
|
||||
"select-output-source": " Destinazione Output Audio : \n\t\t\t\t\t",
|
||||
"add-a-password-to-stream": " Aggiungi Password:",
|
||||
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tBenvenuto in OBS.Ninja! Da qui puoi inviare messaggi di testo direttamente ai peer connessi.\n\t\t\t\t",
|
||||
"names-and-labels-coming-soon": "\n\t\t\t\t\tI nomi che identificano i peer connessi saranno una funzionalità in una prossima versione..\n\t\t\t\t",
|
||||
"send-chat": "Invia",
|
||||
"available-languages": "Lingue Disponibili:",
|
||||
"add-more-here": "Aggiungi altro qui!",
|
||||
"invite-users-to-join": "Invita gli utenti a unirsi al gruppo e a trasmettere il proprio feed. Questi utenti vedranno ogni feed nella stanza.",
|
||||
"link-to-invite-camera": "Link per invitare gli utenti a trasmettere i propri feed al gruppo. Questi utenti non vedranno né sentiranno alcun feed dal gruppo.",
|
||||
"this-is-obs-browser-source-link": "Questo è un collegamento all'origine del browser OBS che è vuoto per impostazione predefinita. I video nella stanza possono essere aggiunti manualmente a questa scena.",
|
||||
"this-is-obs-browser-souce-link-auto": "Anche un collegamento alla sorgente del browser OBS. Tutti i video degli ospiti in questa chat room di gruppo verranno aggiunti automaticamente a questa scena.",
|
||||
"click-for-quick-room-overview": "❔ Fare clic qui per una rapida panoramica e assistenza ",
|
||||
"push-to-talk-enable": "🔊 Abilita Director's Push-to-Talk Mode",
|
||||
"welcome-to-control-room": "Benvenuto. Questa è la sala di controllo per la chat di gruppo. Ci sono diverse cose per cui puoi usare questa stanza:<br><br>\t<li>Puoi ospitare una chat di gruppo con gli amici utilizzando una stanza. Condividi il link blu per invitare gli ospiti che si uniranno automaticamente alla chat.</li>\t<li>Una sala per gruppi può ospitare da 4 a 30 persone, a seconda di numerosi fattori, tra cui CPU e larghezza di banda disponibile di tutti gli ospiti nella stanza.</li>\t<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\t<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\t<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\t<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\t<br>\tAs guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\t<br>The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br><br>Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br><br>\tFor advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a>",
|
||||
"guest-will-appaer-here-on-join": "(Quando un ospite si unisce, verrà visualizzato un video qui)",
|
||||
"SOLO-LINK": "SOLO LINK for OBS:"
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
"add-group-chat": "OBSにグループミーティングを追加",
|
||||
"add-to-group": "グループシーンに追加",
|
||||
"add-your-camera": "OBSに自分のカメラを追加",
|
||||
"added-notes": "<i><u>追加情報:<u></i><li>ルーム名を知っている人は誰でもルームに入れるため、ユニークなルーム名にして下さい。</li><li>ハードウェア性能にもよりますが、パフォーマンス上の理由から、4人以上のルーム利用はおすすめできません。</li><li>iOSデバイスでは、2人以下のグループサイズに制限されます。これはハードウェアによる制限です。</li><li>\"Recording\" オプションは実験的な新機能です。</li><li>ビデオフィードを「グループシーン」に表示するには、そこに「追加」する必要があります。</li><li>ゲストのビューに、新しい「強化されたフルスクリーン」ボタンが追加されました。</li>",
|
||||
"added-notes": "<i><u>追加情報:<u></u></u></i><li><u><u>ルーム名を知っている人は誰でもルームに入れるため、ユニークなルーム名にして下さい。</u></u></li><li><u><u>ハードウェア性能にもよりますが、パフォーマンス上の理由から、4人以上のルーム利用はおすすめできません。</u></u></li><li><u><u>iOSデバイスでは、2人以下のグループサイズに制限されます。これはハードウェアによる制限です。</u></u></li><li><u><u>\"Recording\" オプションは実験的な新機能です。</u></u></li><li><u><u>ビデオフィードを「グループシーン」に表示するには、そこに「追加」する必要があります。</u></u></li><li><u><u>ゲストのビューに、新しい「強化されたフルスクリーン」ボタンが追加されました。</u></u></li>",
|
||||
"advanced-paramaters": "高度なパラメータ",
|
||||
"audio-sources": "音声ソース",
|
||||
"back": "戻る",
|
||||
@@ -17,7 +17,7 @@
|
||||
"generate-invite-link": "招待リンクを作成",
|
||||
"here-you-can-pre-generate": "再利用可能なブラウザソースリンクと、関連するゲスト招待リンクを、事前に作成できます。",
|
||||
"high-security-mode": "高セキュリティモード",
|
||||
"info-blob": "<h2>OBS.Ninja とは?</h2><br><li>超低遅延でプライバシーが保護された、ビデオストリームサービスです。</li><li>ライブ配信でゲストとの対話を配信したり、少人数のグループミーティングにも利用できます。</li><li>100% <strong>無料</strong>、ダウンロード不要、サインイン不要、個人情報を一切収集しません。</li><li>あなたや友人のスマートフォン、タブレット、PCなどから、直接OBSビデオストリームに映像を取り込めます。</li><li>プライバシーと超低遅延を実現するために、最先端のピアツーピア転送技術を使用しています。</li><br><li>YouTube: <i class=\"fa fa-youtube-play\" aria-hidden=\"true\"></i> <a href=\"https://www.youtube.com/watch?v=6R_sQKxFAhg\">デモ動画を見る</a> </li><li>Github: <i class=\"fa fa-github\" aria-hidden=\"true\"></i> <a href=\"https://github.com/steveseguin/obsninja\">https://github.com/steveseguin/obsninja</a> </li><br><i><font style=\"color:red\">既知の問題点:</font></i><br><li><i class=\"fa fa-apple\" aria-hidden=\"true\"></i>MacOSユーザーは、OBS v23を使用するか、OBS v25でChromeブラウザーを<i>ウィンドウキャプチャー</i>する必要があります。</li><li>一部のユーザーは「ピクセレーション」問題が発生します。その場合、URLパラメータに <code>&codec=vp9</code> を追加して下さい。</li><br><i>フォーラムや連絡先:</i><br><li>ヘルプや高度な情報は、<a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a><i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"> でチェックして下さい。</li><li><a href=\"https://discord.gg/EksyhGA\">Discord</a> もあります。</li><li>メール <a href=\"mailto:steve@seguin.email\">steve@seguin.email</a> でも連絡できます。</i>",
|
||||
"info-blob": "<h2>OBS.Ninja とは?</h2><br><li>超低遅延でプライバシーが保護された、ビデオストリームサービスです。</li><li>ライブ配信でゲストとの対話を配信したり、少人数のグループミーティングにも利用できます。</li><li>100% <strong>無料</strong>、ダウンロード不要、サインイン不要、個人情報を一切収集しません。</li><li>あなたや友人のスマートフォン、タブレット、PCなどから、直接OBSビデオストリームに映像を取り込めます。</li><li>プライバシーと超低遅延を実現するために、最先端のピアツーピア転送技術を使用しています。</li><br><li>YouTube: <i class=\"fa fa-youtube-play\" aria-hidden=\"true\"></i> <a href=\"https://www.youtube.com/watch?v=6R_sQKxFAhg\">デモ動画を見る</a> </li><li>Github: <i class=\"fa fa-github\" aria-hidden=\"true\"></i> <a href=\"https://github.com/steveseguin/obsninja\">https://github.com/steveseguin/obsninja</a> </li><br><i><font style=\"color:red\">既知の問題点:</font></i><br><li><i class=\"fa fa-apple\" aria-hidden=\"true\"></i>MacOSユーザーは、OBS v23を使用するか、OBS v25でChromeブラウザーを<i>ウィンドウキャプチャー</i>する必要があります。</li><li>一部のユーザーは「ピクセレーション」問題が発生します。その場合、URLパラメータに <code>&codec=vp9</code> を追加して下さい。</li><br><i>フォーラムや連絡先:</i><br><li>ヘルプや高度な情報は、<a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a><i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"> でチェックして下さい。</i></li><li><i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"><a href=\"https://discord.gg/EksyhGA\">Discord</a> もあります。</i></li><li><i class=\"fa fa-reddit-alien\" aria-hidden=\"true\">メール <a href=\"mailto:steve@seguin.email\">steve@seguin.email</a> でも連絡できます。</i></li>",
|
||||
"joining-room": "ルームに参加しています",
|
||||
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
|
||||
"max-resolution": "最大解像度",
|
||||
@@ -50,5 +50,19 @@
|
||||
"cant-see-or-hear": "グループミーティングの映像・音声を視聴できない",
|
||||
"password-input-field": "Password",
|
||||
"select-output-source": "音声出力先:",
|
||||
"add-a-password-to-stream": "パスワードを追加:"
|
||||
}
|
||||
"add-a-password-to-stream": "パスワードを追加:",
|
||||
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome to OBS.Ninja! You can send text messages directly to connected peers from here.\n\t\t\t\t",
|
||||
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
|
||||
"send-chat": "Send",
|
||||
"available-languages": "Available Languages:",
|
||||
"add-more-here": "Add More Here!",
|
||||
"invite-users-to-join": "Invites users to join the group and broadcast their feed to it. These users will see every feed in the room.",
|
||||
"link-to-invite-camera": "Link to invite users to broadcast their feeds to the group. These users will not see or hear any feed from the group.",
|
||||
"this-is-obs-browser-source-link": "This is an OBS Browser Source link that is empty by default. Videos in the room can be manually added to this scene.",
|
||||
"this-is-obs-browser-souce-link-auto": "Also an OBS Browser Source link. All guest videos in this group chat room will automatically be added into this scene.",
|
||||
"click-for-quick-room-overview": "❔ Click Here for a quick overview and help",
|
||||
"push-to-talk-enable": "🔊 Enable Director's Push-to-Talk Mode",
|
||||
"welcome-to-control-room": "Welcome. This is the control-room for the group-chat. There are different things you can use this room for:<br><br>\t<li>You can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.</li>\t<li>A group room can handle around 4 to 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\t<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\t<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\t<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\t<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\t<br>\tAs guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\t<br>The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br><br>Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br><br>\tFor advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a>",
|
||||
"guest-will-appaer-here-on-join": "(A video will appear here when a guest joins)",
|
||||
"SOLO-LINK": "SOLO LINK for OBS:"
|
||||
}
|
||||
@@ -1,51 +1,68 @@
|
||||
{
|
||||
"GO": "START",
|
||||
"add-group-chat": "Voeg Groepsgesprek toe",
|
||||
"add-to-group": "Voeg toe aan Groepsscene",
|
||||
"add-your-camera": "Voeg je Camera toe",
|
||||
"added-notes": "\n\t\t\t\t<u><i>Notities:</i></u>\n\t\t\t\t<li>Iedereen kan de kamer binnenkomen als ze de naam kennen, dus hou hem uniek</li>\n\t\t\t\t<li>Meer dan vier (4) mensen in een kamer is niet aan te raden vanwege prestatie redenen, maar is afhankelijk van uw hardware.</li>\n\t\t\t\t<li>Bij iOS apparaten is de video alleen zichtbaar voor de regiseur. Dit is een hardware beperking.</li>\n\t\t\t\t<li>De \"Opname\" optie is nieuw en is experimenteel.</li>\n\t\t\t\t<li>U moet een video stroom \"Toevoegen\" aan de \"Groeps Scene\" om het hier te tonen.</li>\n\t\t\t\t<li>Er is een nieuwe \"uitgebreid volledig scherm\" knop toegevoegd aan het Gasten scherm.</li>\n\t\t\t\t",
|
||||
"advanced-paramaters": "Geavanceerde Parameters",
|
||||
"audio-sources": "Geluidsbronnen",
|
||||
"back": "Terug",
|
||||
"balanced": "Gebalanceerd",
|
||||
"copy-this-url": "Deelbare Link naar deze video",
|
||||
"copy-to-clipboard": "Kopiëren naar Clipboard",
|
||||
"create-reusable-invite": "Maak Herbruikbare Uitnodiging",
|
||||
"enable-stereo-and-pro": "Activeer Stereo en Pro HD Geluid",
|
||||
"enter-the-rooms-control": "Ga de Kamer's Controle Centrum in",
|
||||
"force-vp9-video-codec": "Forceer VP9 Video Codec (minder verstoring)",
|
||||
"generate-invite-link": "GENEREER DE UITNODIGINGS LINK",
|
||||
"here-you-can-pre-generate": "Hier kan u vooraf een herbruikbare weergave link en een bijbehorende gast uitnodigingslink aanmaken.",
|
||||
"high-security-mode": "Hoge Beveilingsstand",
|
||||
"info-blob": "\n\t\t\t\t\t\t<h2>Wat is OBS.Ninja</h2><br>\n\t\t\t\t\t\t<li>100% <b>gratis</b>; geen downloads; geen persoonlijke gegevens verzamelen; niet inloggen</li>\n\t\t\t\t\t\t<li>Breng video van uw smartphone, laptop, computer, of van uw vrienden direct in uw OBS video stroom</li>\n\t\t\t\t\t\t<li>We gebruiken vooruitstrevende Peer-to-Peer technologie die privacy en ultra lage vertraging biedt</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<li>Youtube video <i class=\"fa fa-youtube-play\" aria-hidden=\"true\"></i> <a href=\"https://www.youtube.com/watch?v=6R_sQKxFAhg\">Demonstratie</a> </li>\n\t\t\t\t\t\t<li>Code is beschikbaar op: <i class=\"fa fa-github\" aria-hidden=\"true\"></i> <a href=\"https://github.com/steveseguin/obsninja\">https://github.com/steveseguin/obsninja</a> </li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<i><font style=\"color:red\">Bekende problemen:</font></i><br>\n\n\t\t\t\t\t\t<li><i class=\"fa fa-apple\" aria-hidden=\"true\"></i> MacOS gebruikers moeten OBS v23 gebruiken of terugvallen op <i>Window Capturing</i> van een Chrome Browser met OBS v25</li>\n\t\t\t\t\t\t<li>Sommige gebruikers kunnen \"pixelatie\" problemen met videos ervaren. Voeg dan de URL parameter <b>&codec=vp9</b> toe aan de OBS Links om dit te corrigeren.</li>\n\t<h3><i>Kijk ook op <a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a> <i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"></i> voor hulp en uitgebreide informatie. Ik zit ook op <a href=\"https://discord.gg/EksyhGA\">Discord</a> en u kan me mailen op steve@seguin.email</i></h3>\n\t\t\t\t\t",
|
||||
"joining-room": "U neemt deel aan de kamer",
|
||||
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS Ninja",
|
||||
"max-resolution": "Max Resolutie",
|
||||
"mute": "Demp",
|
||||
"no-audio": "Geen Geluid",
|
||||
"note-share-audio": "\n\t\t\t\t\t<b>Noot</b>: Vergeet niet op \"Deel geluid\" te klikken in Chrome.<br>(Firefox ondersteung geen geluid delen.)",
|
||||
"open-in-new-tab": "Open in nieuwe Tab",
|
||||
"record": "Neem op",
|
||||
"remote-control-for-obs": "Afstandsbediening",
|
||||
"remote-screenshare-obs": "Deel externe scherm",
|
||||
"room-name": "Kamer Naam",
|
||||
"rooms-allow-for": "Kamers maken eenvoudige groepsgespreken en geavanceerd beheer van meerdere streams tegelijk mogelijk.",
|
||||
"select-audio-source": "Selecteer Geluidsbronnen",
|
||||
"select-audio-video": "Selecteer de geluid/video bron hieronder",
|
||||
"select-screen-to-share": "SELECTEER SCHERM OM TE DELEN",
|
||||
"show-tips": "Toon me wat tips..",
|
||||
"smooth-cool": "Soepel en Koel",
|
||||
"unlock-video-bitrate": "Ontsluit Video Bitrate (20mbps)",
|
||||
"video-source": "Video bron",
|
||||
"volume": "Volume",
|
||||
"you-are-in-the-control-center": "U bent in het kamer beheers centrum",
|
||||
"waiting-for-camera": "Wachten op het Laden van de Camera",
|
||||
"video-resolution": "Video Resolutie: ",
|
||||
"hide-screen-share": "Verberg Scherm Delen Optie",
|
||||
"allow-remote-control": "Afstandsbediening Camera Zoom (android)",
|
||||
"add-the-guest-to-a-room": " Voeg de gast toe aan een kamer:",
|
||||
"invite-group-chat-type": "Deze kamer gast kan:",
|
||||
"can-see-and-hear": "Het groepsgesprek zien en horen",
|
||||
"can-hear-only": "Alleen het groepsgesprek horen",
|
||||
"cant-see-or-hear": "Het groepsgesprek niet horen en zien"
|
||||
{
|
||||
"GO": "START",
|
||||
"add-group-chat": "Voeg Groepsgesprek toe",
|
||||
"add-to-group": "Voeg toe aan Groepsscene",
|
||||
"add-your-camera": "Voeg je Camera toe",
|
||||
"added-notes": "\n\t\t\t\t<u><i>Notities:</i></u>\n\t\t\t\t<li>Iedereen kan de kamer binnenkomen als ze de naam kennen, dus hou hem uniek</li>\n\t\t\t\t<li>Meer dan vier (4) mensen in een kamer is niet aan te raden vanwege prestatie redenen, maar is afhankelijk van uw hardware.</li>\n\t\t\t\t<li>Bij iOS apparaten is de video alleen zichtbaar voor de regiseur. Dit is een hardware beperking.</li>\n\t\t\t\t<li>De \"Opname\" optie is nieuw en is experimenteel.</li>\n\t\t\t\t<li>U moet een video stroom \"Toevoegen\" aan de \"Groeps Scene\" om het hier te tonen.</li>\n\t\t\t\t<li>Er is een nieuwe \"uitgebreid volledig scherm\" knop toegevoegd aan het Gasten scherm.</li>\n\t\t\t\t",
|
||||
"advanced-paramaters": "Geavanceerde Parameters",
|
||||
"audio-sources": "Geluidsbronnen",
|
||||
"back": "Terug",
|
||||
"balanced": "Gebalanceerd",
|
||||
"copy-this-url": "Deelbare Link naar deze video",
|
||||
"copy-to-clipboard": "Kopiëren naar Clipboard",
|
||||
"create-reusable-invite": "Maak Herbruikbare Uitnodiging",
|
||||
"enable-stereo-and-pro": "Activeer Stereo en Pro HD Geluid",
|
||||
"enter-the-rooms-control": "Ga de Kamer's Controle Centrum in",
|
||||
"force-vp9-video-codec": "Forceer VP9 Video Codec (minder verstoring)",
|
||||
"generate-invite-link": "GENEREER DE UITNODIGINGS LINK",
|
||||
"here-you-can-pre-generate": "Hier kan u vooraf een herbruikbare weergave link en een bijbehorende gast uitnodigingslink aanmaken.",
|
||||
"high-security-mode": "Hoge Beveilingsstand",
|
||||
"info-blob": "\n\t\t\t\t\t\t<h2>Wat is OBS.Ninja</h2><br>\n\t\t\t\t\t\t<li>100% <b>gratis</b>; geen downloads; geen persoonlijke gegevens verzamelen; niet inloggen</li>\n\t\t\t\t\t\t<li>Breng video van uw smartphone, laptop, computer, of van uw vrienden direct in uw OBS video stroom</li>\n\t\t\t\t\t\t<li>We gebruiken vooruitstrevende Peer-to-Peer technologie die privacy en ultra lage vertraging biedt</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<li>Youtube video <i class=\"fa fa-youtube-play\" aria-hidden=\"true\"></i> <a href=\"https://www.youtube.com/watch?v=6R_sQKxFAhg\">Demonstratie</a> </li>\n\t\t\t\t\t\t<li>Code is beschikbaar op: <i class=\"fa fa-github\" aria-hidden=\"true\"></i> <a href=\"https://github.com/steveseguin/obsninja\">https://github.com/steveseguin/obsninja</a> </li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<i><font style=\"color:red\">Bekende problemen:</font></i><br>\n\n\t\t\t\t\t\t<li><i class=\"fa fa-apple\" aria-hidden=\"true\"></i> MacOS gebruikers moeten OBS v23 gebruiken of terugvallen op <i>Window Capturing</i> van een Chrome Browser met OBS v25</li>\n\t\t\t\t\t\t<li>Sommige gebruikers kunnen \"pixelatie\" problemen met videos ervaren. Voeg dan de URL parameter <b>&codec=vp9</b> toe aan de OBS Links om dit te corrigeren.</li>\n\t<h3><i>Kijk ook op <a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a> <i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"></i> voor hulp en uitgebreide informatie. Ik zit ook op <a href=\"https://discord.gg/EksyhGA\">Discord</a> en u kan me mailen op steve@seguin.email</i></h3>\n\t\t\t\t\t",
|
||||
"joining-room": "U neemt deel aan de kamer",
|
||||
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS Ninja",
|
||||
"max-resolution": "Max Resolutie",
|
||||
"mute": "Demp",
|
||||
"no-audio": "Geen Geluid",
|
||||
"note-share-audio": "\n\t\t\t\t\t<b>Noot</b>: Vergeet niet op \"Deel geluid\" te klikken in Chrome.<br>(Firefox ondersteung geen geluid delen.)",
|
||||
"open-in-new-tab": "Open in nieuwe Tab",
|
||||
"record": "Neem op",
|
||||
"remote-control-for-obs": "Afstandsbediening",
|
||||
"remote-screenshare-obs": "Deel externe scherm",
|
||||
"room-name": "Kamer Naam",
|
||||
"rooms-allow-for": "Kamers maken eenvoudige groepsgespreken en geavanceerd beheer van meerdere streams tegelijk mogelijk.",
|
||||
"select-audio-source": "Selecteer Geluidsbronnen",
|
||||
"select-audio-video": "Selecteer de geluid/video bron hieronder",
|
||||
"select-screen-to-share": "SELECTEER SCHERM OM TE DELEN",
|
||||
"show-tips": "Toon me wat tips..",
|
||||
"smooth-cool": "Soepel en Koel",
|
||||
"unlock-video-bitrate": "Ontsluit Video Bitrate (20mbps)",
|
||||
"video-source": "Video bron",
|
||||
"volume": "Volume",
|
||||
"you-are-in-the-control-center": "U bent in het kamer beheers centrum",
|
||||
"waiting-for-camera": "Wachten op het Laden van de Camera",
|
||||
"video-resolution": "Video Resolutie: ",
|
||||
"hide-screen-share": "Verberg Scherm Delen Optie",
|
||||
"allow-remote-control": "Afstandsbediening Camera Zoom (android)",
|
||||
"add-the-guest-to-a-room": " Voeg de gast toe aan een kamer:",
|
||||
"invite-group-chat-type": "Deze kamer gast kan:",
|
||||
"can-see-and-hear": "Het groepsgesprek zien en horen",
|
||||
"can-hear-only": "Alleen het groepsgesprek horen",
|
||||
"cant-see-or-hear": "Het groepsgesprek niet horen en zien",
|
||||
"password-input-field": "Password",
|
||||
"select-output-source": " Audio Output Destination: \n\t\t\t\t\t",
|
||||
"add-a-password-to-stream": " Add a password:",
|
||||
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome to OBS.Ninja! You can send text messages directly to connected peers from here.\n\t\t\t\t",
|
||||
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
|
||||
"send-chat": "Send",
|
||||
"available-languages": "Available Languages:",
|
||||
"add-more-here": "Add More Here!",
|
||||
"invite-users-to-join": "Invites users to join the group and broadcast their feed to it. These users will see every feed in the room.",
|
||||
"link-to-invite-camera": "Link to invite users to broadcast their feeds to the group. These users will not see or hear any feed from the group.",
|
||||
"this-is-obs-browser-source-link": "This is an OBS Browser Source link that is empty by default. Videos in the room can be manually added to this scene.",
|
||||
"this-is-obs-browser-souce-link-auto": "Also an OBS Browser Source link. All guest videos in this group chat room will automatically be added into this scene.",
|
||||
"click-for-quick-room-overview": "❔ Click Here for a quick overview and help",
|
||||
"push-to-talk-enable": "🔊 Enable Director's Push-to-Talk Mode",
|
||||
"welcome-to-control-room": "Welcome. This is the control-room for the group-chat. There are different things you can use this room for:<br><br>\t<li>You can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.</li>\t<li>A group room can handle around 4 to 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\t<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\t<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\t<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\t<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\t<br>\tAs guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\t<br>The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br><br>Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br><br>\tFor advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a>",
|
||||
"guest-will-appaer-here-on-join": "(A video will appear here when a guest joins)",
|
||||
"SOLO-LINK": "SOLO LINK for OBS:"
|
||||
}
|
||||
51
translations/pig.json
Normal file
51
translations/pig.json
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"GO": "OGAY",
|
||||
"add-group-chat": "Addway Oupgray Atchay",
|
||||
"add-to-group": "Addway Oupgray Atchay",
|
||||
"add-your-camera": "Addway ouryay Ameracay",
|
||||
"added-notes": "\n\t\t\t\t<u><i>Addedway Otesnay:</i></u>\n\t\t\t\t<li>Anyoneway ancay enterway away oomray ifway eythay owknay ethay amenay, osay eepkay itway uniqueway</li>\n\t\t\t\t<li>Avinghay oremay anthay ourfay (4) eoplepay inway away oomray isway otnay advisableway ueday otay erformancepay easonsray, utbay itway ependsday onway ouryay ardwarehay.</li>\n\t\t\t\t<li>iOSWAY evicesday illway avehay eirthay ideovay onlyway ebay isiblevay otay ethay irectorday. Isthay isway away ardwarehay imitationlay.</li>\n\t\t\t\t<li>Ethay \"Ecordingray\" optionway isway ewnay andway isway onsideredcay experimentalway.</li>\n\t\t\t\t",
|
||||
"advanced-paramaters": "Advancedway Arameterspay",
|
||||
"audio-sources": "Audioway Ourcessay",
|
||||
"back": "Ackbay",
|
||||
"balanced": "Alancedbay",
|
||||
"copy-this-url": "Arableshay Inklay otay isthay ideovay",
|
||||
"copy-to-clipboard": "Opycay otay Ipboardclay",
|
||||
"create-reusable-invite": "Eatecray Eusableray Inviteway",
|
||||
"enable-stereo-and-pro": "Enableway Ereostay andway Opray HDAY Audioway",
|
||||
"enter-the-rooms-control": "Enterway ethay Oom'sray Ontrolcay Entercay",
|
||||
"force-vp9-video-codec": "Orcefay VPAY9 Ideovay Odeccay (esslay artifactingway)",
|
||||
"generate-invite-link": "ENERATEGAY ETHAY INVITEWAY INKLAY",
|
||||
"here-you-can-pre-generate": "Erehay ouyay ancay epray-enerategay away eusableray iewvay inklay andway away elatedray uestgay inviteway inklay.",
|
||||
"high-security-mode": "Ighhay Ecuritysay Odemay",
|
||||
"info-blob": "",
|
||||
"joining-room": "Ouyay areway oiningjay oomray",
|
||||
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS Ninja - Pig Latin",
|
||||
"max-resolution": "Axmay Esolutionray",
|
||||
"mute": "Utemay",
|
||||
"no-audio": "Onay Audioway",
|
||||
"note-share-audio": "\n",
|
||||
"open-in-new-tab": "Openway inway ewnay Abtay",
|
||||
"record": "Ecordray",
|
||||
"remote-control-for-obs": "Emoteray Ontrolcay",
|
||||
"remote-screenshare-obs": "Emoteray Eensharescray",
|
||||
"room-name": "Oomray Amenay",
|
||||
"rooms-allow-for": "Oomsray allowway orfay implifiedsay oupgray-atchay andway ethay advancedway anagementmay ofway ultiplemay eamsstray atway onceway.",
|
||||
"select-audio-source": "Electsay Audioway Ourcessay",
|
||||
"select-audio-video": "Electsay ethay audioway/ideovay ourcesay elowbay",
|
||||
"select-screen-to-share": "ELECTSAY EENSCRAY OTAY ARESHAY",
|
||||
"show-tips": "Owshay emay omesay ipstay..",
|
||||
"smooth-cool": "Oothsmay andway Oolcay",
|
||||
"unlock-video-bitrate": "Unlockway Ideovay Itratebay (20mbpsay)",
|
||||
"video-source": "Ideovay ourcesay",
|
||||
"volume": "Olumevay",
|
||||
"you-are-in-the-control-center": "Ouyay areway inway ethay oom'sray ontrolcay entercay",
|
||||
"waiting-for-camera": "Aitingway orfay Ameracay otay Oadlay",
|
||||
"video-resolution": "Ideovay Esolutionray: ",
|
||||
"hide-screen-share": "Idehay Eensharescray Optionway",
|
||||
"allow-remote-control": "Emoteray Ontrolcay Ameracay Oomzay (androidway)",
|
||||
"add-the-guest-to-a-room": " Addway ethay uestgay otay away oomray:",
|
||||
"invite-group-chat-type": "Isthay oomray uestgay ancay:",
|
||||
"can-see-and-hear": "Ancay eesay andway earhay ethay oupgray atchay",
|
||||
"can-hear-only": "Ancay onlyway earhay ethay oupgray atchay",
|
||||
"cant-see-or-hear": "Annotcay earhay orway eesay ethay oupgray atchay"
|
||||
}
|
||||
@@ -39,13 +39,30 @@
|
||||
"video-source": "Fonte de vídeo",
|
||||
"volume": "Volume",
|
||||
"you-are-in-the-control-center": "Está no Centro de Controlo da Sala",
|
||||
"waiting-for-camera": "Waiting for Camera to Load",
|
||||
"video-resolution": "Video Resolution: ",
|
||||
"hide-screen-share": "Hide Screenshare Option",
|
||||
"allow-remote-control": "Remote Control Camera Zoom (android)",
|
||||
"add-the-guest-to-a-room": " Add the guest to a room:",
|
||||
"invite-group-chat-type": "This room guest can:",
|
||||
"can-see-and-hear": "Can see and hear the group chat",
|
||||
"can-hear-only": "Can only hear the group chat",
|
||||
"cant-see-or-hear": "Cannot hear or see the group chat"
|
||||
"waiting-for-camera": "Esperando pela câmera",
|
||||
"video-resolution": "Resolução de Vídeo: ",
|
||||
"hide-screen-share": "Esconder opção de partilhar ecrã",
|
||||
"allow-remote-control": "Controlo remoto do zoom da câmera (android)",
|
||||
"add-the-guest-to-a-room": " Adicionar convidado a uma sala:",
|
||||
"invite-group-chat-type": "Este convidado pode:",
|
||||
"can-see-and-hear": "Pode ver e ouvir o chat de grupo",
|
||||
"can-hear-only": "Pode apenas ouvir o chat de grupo",
|
||||
"cant-see-or-hear": "Não pode ver ou ouvir o chat de grupo",
|
||||
"password-input-field": "Password",
|
||||
"select-output-source": " Saída de áudio: \n\t\t\t\t\t",
|
||||
"add-a-password-to-stream": " Adicionar uma password:",
|
||||
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tBem vindo ao OBS.Ninja! Pode enviar mensagens diretas a quem estiver aqui ligado a partir daqui.\n\t\t\t\t",
|
||||
"names-and-labels-coming-soon": "\n\t\t\t\t\tNomes a identificar as ligações será uma funcionalidade futura.\n\t\t\t\t",
|
||||
"send-chat": "Enviar",
|
||||
"available-languages": "Línguas disponíveis:",
|
||||
"add-more-here": "Adicionar mais aqui!",
|
||||
"invite-users-to-join": "Invites users to join the group and broadcast their feed to it. These users will see every feed in the room.",
|
||||
"link-to-invite-camera": "Link to invite users to broadcast their feeds to the group. These users will not see or hear any feed from the group.",
|
||||
"this-is-obs-browser-source-link": "This is an OBS Browser Source link that is empty by default. Videos in the room can be manually added to this scene.",
|
||||
"this-is-obs-browser-souce-link-auto": "Also an OBS Browser Source link. All guest videos in this group chat room will automatically be added into this scene.",
|
||||
"click-for-quick-room-overview": "❔ Click Here for a quick overview and help",
|
||||
"push-to-talk-enable": "🔊 Enable Director's Push-to-Talk Mode",
|
||||
"welcome-to-control-room": "Welcome. This is the control-room for the group-chat. There are different things you can use this room for:<br><br>\t<li>You can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.</li>\t<li>A group room can handle around 4 to 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\t<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\t<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\t<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\t<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\t<br>\tAs guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\t<br>The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br><br>Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br><br>\tFor advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a>",
|
||||
"guest-will-appaer-here-on-join": "(A video will appear here when a guest joins)",
|
||||
"SOLO-LINK": "SOLO LINK for OBS:"
|
||||
}
|
||||
@@ -1,42 +1,68 @@
|
||||
{
|
||||
"GO": "ВОЙТИ",
|
||||
"add-group-chat": "Добавить групповой чат в OBS",
|
||||
"add-to-group": "Добавить в групповую сцену",
|
||||
"add-your-camera": "Добавьте свою камеру в OBS",
|
||||
"added-notes": "\n\t\t\t\t<u><i>Добавленные заметки:</i></u>\n\t\t\t\t<li>Любой может войти в комнату, если знает имя, поэтому оставьте его уникальным</li>\n\t\t\t\t<li>Наличие более четырех (4) человек в комнате не рекомендуется по причинам производительности, но это зависит от вашего оборудования.</li>\n\t\t\t\t<li>Устройства iOS ограничены размерами группы не более двух (2) человек. Это аппаратное ограничение.</li>\n\t\t\t\t",
|
||||
"advanced-paramaters": "Расширенные параметры",
|
||||
"audio-sources": "Источники звука",
|
||||
"back": "Назад",
|
||||
"balanced": "Сбалансированный",
|
||||
"copy-this-url": "Скопируйте этот URL-адрес в OBS \"Браузер\"",
|
||||
"copy-to-clipboard": "Скопировано в буфер обмена",
|
||||
"create-reusable-invite": "Создать многоразовое приглашение",
|
||||
"enable-stereo-and-pro": "Включить стерео и Pro HD Audio",
|
||||
"enter-the-rooms-control": "Войдите в центр управления комнатой",
|
||||
"force-vp9-video-codec": "Видеокодек Force VP9 (меньше артефактов)",
|
||||
"generate-invite-link": "СГЕНЕРИРОВАТЬ ССЫЛКУ-ПРИГЛАШЕНИЕ",
|
||||
"here-you-can-pre-generate": "Здесь вы можете предварительно сгенерировать повторно используемую ссылку на источник браузера и связанную гостевую ссылку для приглашения..",
|
||||
"high-security-mode": "Режим повышенной безопасности",
|
||||
"info-blob": "\n\t\t\t\t\t\t<h2>Что такое OBS.Ninja</h2><br>\n\t\t\t\t\t\t<li><b>бесплатно</b> на 100%; нет загрузок; нет сбора личных данных; нет входа</li>\n\t\t\t\t\t\t<li>Добавляйте видео со своего смартфона, ноутбука, компьютера или друзей прямо в видеопоток OBS</li>\n\t\t\t\t\t\t<li>Мы используем передовую технологию переадресации Peer-to-Peer, которая обеспечивает конфиденциальность и сверхнизкую задержку</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<li>Пользователям MacOS необходимо использовать OBS v23 или использовать <i>захват окна</ i> в браузере Google Chrome с OBS v25</li>\n\t\t\t\t\t\t<br><h3><i>Проверьте <a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a> <i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"></i> для помощи и дополнительной информации.</i></h3>\n\t\t\t\t\t",
|
||||
"joining-room": "Вы присоединяетесь к комнате",
|
||||
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja (RU)",
|
||||
"max-resolution": "Максимальное разрешение",
|
||||
"mute": "Отключить звук",
|
||||
"no-audio": "Нет звука",
|
||||
"note-share-audio": "\n\t\t\t\t\tFirefox не поддерживает обмен аудио",
|
||||
"open-in-new-tab": "Открыть в новой вкладке",
|
||||
"record": "Запись",
|
||||
"remote-control-for-obs": "Пульт дистанционного управления для OBS",
|
||||
"remote-screenshare-obs": "Удаленный просмотр экрана в OBS",
|
||||
"room-name": "Название комнаты",
|
||||
"rooms-allow-for": "В комнатах предусмотрены упрощенный групповой чат и расширенное управление несколькими потоками одновременно.",
|
||||
"select-audio-source": "Выберите источники звука",
|
||||
"select-audio-video": "Выберите источник аудио / видео ниже",
|
||||
"select-screen-to-share": "Выберите экран, чтобы поделиться",
|
||||
"show-tips": "Покажите мне несколько советов..",
|
||||
"smooth-cool": "Гладко и круто",
|
||||
"unlock-video-bitrate": "Разблокировать битрейт видео (20 Мбит/с)",
|
||||
"video-source": "Источники видео",
|
||||
"volume": "Громкость",
|
||||
"you-are-in-the-control-center": "Вы находитесь в центре управления комнатой"
|
||||
}
|
||||
{
|
||||
"GO": "ВОЙТИ",
|
||||
"add-group-chat": "Добавить групповой чат в OBS",
|
||||
"add-to-group": "Добавить в групповую сцену",
|
||||
"add-your-camera": "Добавьте свою камеру в OBS",
|
||||
"added-notes": "\n\t\t\t\t<u><i>Добавленные заметки:</i></u>\n\t\t\t\t<li>Любой может войти в комнату, если знает имя, поэтому оставьте его уникальным</li>\n\t\t\t\t<li>Наличие более четырех (4) человек в комнате не рекомендуется по причинам производительности, но это зависит от вашего оборудования.</li>\n\t\t\t\t<li>Устройства iOS ограничены размерами группы не более двух (2) человек. Это аппаратное ограничение.</li>\n\t\t\t\t",
|
||||
"advanced-paramaters": "Расширенные параметры",
|
||||
"audio-sources": "Источники звука",
|
||||
"back": "Назад",
|
||||
"balanced": "Сбалансированный",
|
||||
"copy-this-url": "Скопируйте этот URL-адрес в OBS \"Браузер\"",
|
||||
"copy-to-clipboard": "Скопировано в буфер обмена",
|
||||
"create-reusable-invite": "Создать многоразовое приглашение",
|
||||
"enable-stereo-and-pro": "Включить стерео и Pro HD Audio",
|
||||
"enter-the-rooms-control": "Войдите в центр управления комнатой",
|
||||
"force-vp9-video-codec": "Видеокодек Force VP9 (меньше артефактов)",
|
||||
"generate-invite-link": "СГЕНЕРИРОВАТЬ ССЫЛКУ-ПРИГЛАШЕНИЕ",
|
||||
"here-you-can-pre-generate": "Здесь вы можете предварительно сгенерировать повторно используемую ссылку на источник браузера и связанную гостевую ссылку для приглашения..",
|
||||
"high-security-mode": "Режим повышенной безопасности",
|
||||
"info-blob": "\n\t\t\t\t\t\t<h2>Что такое OBS.Ninja</h2><br>\n\t\t\t\t\t\t<li><b>бесплатно</b> на 100%; нет загрузок; нет сбора личных данных; нет входа</li>\n\t\t\t\t\t\t<li>Добавляйте видео со своего смартфона, ноутбука, компьютера или друзей прямо в видеопоток OBS</li>\n\t\t\t\t\t\t<li>Мы используем передовую технологию переадресации Peer-to-Peer, которая обеспечивает конфиденциальность и сверхнизкую задержку</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<li>Пользователям MacOS необходимо использовать OBS v23 или использовать <i>захват окна<!-- i--> в браузере Google Chrome с OBS v25</i></li><i>\n\t\t\t\t\t\t<br><h3><i>Проверьте <a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a> <i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"></i> для помощи и дополнительной информации.</i></h3>\n\t\t\t\t\t</i>",
|
||||
"joining-room": "Вы присоединяетесь к комнате",
|
||||
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja (RU)",
|
||||
"max-resolution": "Максимальное разрешение",
|
||||
"mute": "Отключить звук",
|
||||
"no-audio": "Нет звука",
|
||||
"note-share-audio": "\n\t\t\t\t\tFirefox не поддерживает обмен аудио",
|
||||
"open-in-new-tab": "Открыть в новой вкладке",
|
||||
"record": "Запись",
|
||||
"remote-control-for-obs": "Пульт дистанционного управления для OBS",
|
||||
"remote-screenshare-obs": "Удаленный просмотр экрана в OBS",
|
||||
"room-name": "Название комнаты",
|
||||
"rooms-allow-for": "В комнатах предусмотрены упрощенный групповой чат и расширенное управление несколькими потоками одновременно.",
|
||||
"select-audio-source": "Выберите источники звука",
|
||||
"select-audio-video": "Выберите источник аудио / видео ниже",
|
||||
"select-screen-to-share": "Выберите экран, чтобы поделиться",
|
||||
"show-tips": "Покажите мне несколько советов..",
|
||||
"smooth-cool": "Гладко и круто",
|
||||
"unlock-video-bitrate": "Разблокировать битрейт видео (20 Мбит/с)",
|
||||
"video-source": "Источники видео",
|
||||
"volume": "Громкость",
|
||||
"you-are-in-the-control-center": "Вы находитесь в центре управления комнатой",
|
||||
"password-input-field": "Password",
|
||||
"waiting-for-camera": "Waiting for Camera to Load",
|
||||
"select-output-source": " Audio Output Destination: \n\t\t\t\t\t",
|
||||
"video-resolution": "Video Resolution: ",
|
||||
"hide-screen-share": "Hide Screenshare Option",
|
||||
"allow-remote-control": "Remote Control Camera Zoom (android)",
|
||||
"add-a-password-to-stream": " Add a password:",
|
||||
"add-the-guest-to-a-room": " Add the guest to a room:",
|
||||
"invite-group-chat-type": "This room guest can:",
|
||||
"can-see-and-hear": "Can see and hear the group chat",
|
||||
"can-hear-only": "Can only hear the group chat",
|
||||
"cant-see-or-hear": "Cannot hear or see the group chat",
|
||||
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome to OBS.Ninja! You can send text messages directly to connected peers from here.\n\t\t\t\t",
|
||||
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
|
||||
"send-chat": "Send",
|
||||
"available-languages": "Available Languages:",
|
||||
"add-more-here": "Add More Here!",
|
||||
"invite-users-to-join": "Invites users to join the group and broadcast their feed to it. These users will see every feed in the room.",
|
||||
"link-to-invite-camera": "Link to invite users to broadcast their feeds to the group. These users will not see or hear any feed from the group.",
|
||||
"this-is-obs-browser-source-link": "This is an OBS Browser Source link that is empty by default. Videos in the room can be manually added to this scene.",
|
||||
"this-is-obs-browser-souce-link-auto": "Also an OBS Browser Source link. All guest videos in this group chat room will automatically be added into this scene.",
|
||||
"click-for-quick-room-overview": "❔ Click Here for a quick overview and help",
|
||||
"push-to-talk-enable": "🔊 Enable Director's Push-to-Talk Mode",
|
||||
"welcome-to-control-room": "Welcome. This is the control-room for the group-chat. There are different things you can use this room for:<br><br>\t<li>You can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.</li>\t<li>A group room can handle around 4 to 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\t<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\t<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\t<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\t<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\t<br>\tAs guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\t<br>The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br><br>Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br><br>\tFor advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a>",
|
||||
"guest-will-appaer-here-on-join": "(A video will appear here when a guest joins)",
|
||||
"SOLO-LINK": "SOLO LINK for OBS:"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copy and paste this code into OBS.Ninja's developer's console to generate new Translation files
|
||||
|
||||
function downloadTranslation(filename, trans={}){ // downloads the current translation to a file
|
||||
document.querySelectorAll('[data-translate]').forEach(function(ele){
|
||||
allItems.forEach(function(ele){
|
||||
trans[ele.dataset.translate] = ele.innerHTML;
|
||||
});
|
||||
|
||||
@@ -12,42 +12,54 @@ function downloadTranslation(filename, trans={}){ // downloads the current tran
|
||||
hiddenElement.target = '_blank';
|
||||
hiddenElement.download = filename+".json";
|
||||
hiddenElement.click();
|
||||
return trans;
|
||||
}
|
||||
|
||||
|
||||
function updateTranslation(filename){ // updates the website with a specific translation
|
||||
return fetch("./translations/"+filename+'.json').then(function(response){
|
||||
if (response.status !== 200) {
|
||||
log('Looks like there was a problem. Status Code: ' +
|
||||
response.status);
|
||||
return false;
|
||||
var request = new XMLHttpRequest();
|
||||
request.open('GET', "./translations/"+filename+'.json?'+(Math.random()*100).toString(), false); // `false` makes the request synchronous
|
||||
request.send(null);
|
||||
|
||||
if (request.status !== 200) {
|
||||
return;
|
||||
}
|
||||
try{
|
||||
data = JSON.parse(request.responseText);
|
||||
} catch(e){
|
||||
console.log(request.responseText);
|
||||
console.error(e);
|
||||
return false;
|
||||
}
|
||||
allItems.forEach(function(ele){
|
||||
if (ele.dataset.translate in data){
|
||||
ele.innerHTML = data[ele.dataset.translate];
|
||||
}
|
||||
return response.json().then(function(data) {
|
||||
document.querySelectorAll('[data-translate]').forEach(function(ele){
|
||||
if (ele.dataset.translate in data){
|
||||
ele.innerHTML = data[ele.dataset.translate];
|
||||
}
|
||||
});
|
||||
getById("mainmenu").style.opacity = 1;;
|
||||
return [filename, data];
|
||||
}).catch(function(err){
|
||||
errorlog(err);
|
||||
getById("mainmenu").style.opacity = 1;
|
||||
return false;
|
||||
});
|
||||
});
|
||||
return [filename, data];
|
||||
}
|
||||
|
||||
var updateList = ["en", "ru", "fr", "pl", "ar", "de", "it", "nl", "jp", "pt", "zh", "blank"]; // list of languages to update
|
||||
var updateList = ["en", "de", "es", "ru", "fr", "pl", "ja", "ar", "it", "nl", "pt"]; // list of languages to update. Update this if you add a new language.
|
||||
var allItems = document.querySelectorAll('[data-translate]');
|
||||
var defaultTrans = {};
|
||||
allItems.forEach(function(ele){
|
||||
defaultTrans[ele.dataset.translate] = ele.innerHTML;
|
||||
});
|
||||
|
||||
downloadTranslation("default");
|
||||
console.log(defaultTrans);
|
||||
|
||||
for (var i in updateList){
|
||||
var ln = updateList[i];
|
||||
updateTranslation(ln).then(function(res){
|
||||
if (res[0]){
|
||||
console.log(res[0]);
|
||||
downloadTranslation(res[0], res[1]);
|
||||
res = updateTranslation(ln);
|
||||
if (res==false){continue;}
|
||||
if (res[0]){
|
||||
console.log(res[0]);
|
||||
downloadTranslation(res[0], res[1]);
|
||||
}
|
||||
|
||||
allItems.forEach(function(ele){
|
||||
if (ele.dataset.translate in defaultTrans){
|
||||
ele.innerHTML = defaultTrans[ele.dataset.translate];
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
## How to setup a TURN server for free (or near free)
|
||||
## This file is a bit out of day now; see turnserver.md for a newer one.
|
||||
## You can still reference this file/settings when deploying onto Google Cloud or AWS servers.
|
||||
|
||||
# Create a VM instance on Google Cloud (Free Tier available)
|
||||
# Use Ubuntu and Open all PORTS for ingress/egress for TCP/UDP
|
||||
|
||||
111
turnserver.md
Normal file
111
turnserver.md
Normal file
@@ -0,0 +1,111 @@
|
||||
This install script and config file was used with a standard virtual machine server loaded with Ubuntu 20. GCP/AWS servers might need slightly different settings.
|
||||
|
||||
```
|
||||
sudo apt-get update
|
||||
|
||||
sudo apt-get install coturn -y
|
||||
sudo add-apt-repository ppa:certbot/certbot
|
||||
sudo apt-get install certbot -y
|
||||
|
||||
sudo vi /etc/default/coturn
|
||||
```
|
||||
...and we uncomment the line:
|
||||
#TURNSERVER_ENABLED=1
|
||||
….leaving it like this:
|
||||
TURNSERVER_ENABLED=1
|
||||
|
||||
Next make sure you have the DNS pointing to your IP address for this next step (ipv4, and ipv6 if possible). You will need to validate that in the next step.
|
||||
```
|
||||
sudo certbot certonly --standalone
|
||||
sudo apt install net-tools
|
||||
```
|
||||
note: If you run into error 701 issues with your TURN server, check that the coturn service has access to your new SSL certificates:
|
||||
see this issue with coturn: https://github.com/coturn/coturn/issues/268
|
||||
|
||||
You might also want to consider buying a better certificiate, as not all Google-related projects properly support certbot certificates, including libwebrtc. see [this issue ticket](https://github.com/coturn/coturn/issues/240#issuecomment-648550885). If you go this route, see [turnserver2.conf](https://github.com/steveseguin/obsninja/blob/master/turnserver2.conf) for an example config.
|
||||
|
||||
Nexzt, we update the User and Group values in our service file to be "root". This seems to fix the issue with Lets Encrypt. .. I welcome a better solution tho.
|
||||
```
|
||||
sudo vi /usr/lib/systemd/system/coturn.service
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
Next, we are going to open up some ports... just in case they are blocked by default. Which exactly? well, these are default ports. TCP may not be needed?
|
||||
```
|
||||
sudo ufw allow 3478/tcp
|
||||
sudo ufw allow 3478/udp
|
||||
sudo ufw allow 443/tcp
|
||||
sudo ufw allow 443/udp
|
||||
sudo ufw allow 49152:65535/tcp
|
||||
sudo ufw allow 49152:65535/udp
|
||||
```
|
||||
|
||||
Update turnserver.conf with passwords, domain names, and whatever else that needs changing. Example contents are provided below. Once you have updated it, start the TURN server and ensure it started correctly.
|
||||
```
|
||||
sudo vi /etc/turnserver.conf
|
||||
|
||||
sudo systemctl restart coturn
|
||||
sudo systemctl status coturn
|
||||
sudo systemctl enable coturn
|
||||
```
|
||||
|
||||
The following are the contents of an example /etc/turnserver.conf file from above
|
||||
```
|
||||
## sudo vi /etc/turnserver.conf
|
||||
|
||||
listening-port=3478
|
||||
## TLS needs an SSL certificate and domain, but enables TCP
|
||||
tls-listening-port=443
|
||||
|
||||
# min-port=49152
|
||||
# max-port=65535
|
||||
|
||||
realm=turn.obs.ninja
|
||||
server-name=turn.obs.ninja
|
||||
|
||||
## webrtc likes to use this
|
||||
fingerprint
|
||||
|
||||
## Lets just use Google since its more reliable
|
||||
no-stun
|
||||
|
||||
lt-cred-mech
|
||||
user=SOMESUERNAME:SOMEPASSWQORD
|
||||
|
||||
stale-nonce=600
|
||||
|
||||
## depreciated in newer coturn
|
||||
# no-loopback-peers
|
||||
|
||||
## prevents hackers from hacking
|
||||
no-multicast-peers
|
||||
|
||||
## 1-gbps/100 users = ~ 1-mbps each with this setting then
|
||||
total-quota=100
|
||||
|
||||
cert=/etc/letsencrypt/live/turn.obs.ninja/fullchain.pem
|
||||
pkey=/etc/letsencrypt/live/turn.obs.ninja/privkey.pem
|
||||
|
||||
## Tweaks to fix some lets encrypt errors
|
||||
cipher-list="ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384"
|
||||
no-sslv3
|
||||
no-tlsv1
|
||||
no-tlsv1_1
|
||||
# no-tlsv1_2
|
||||
dh2066
|
||||
|
||||
# no-udp
|
||||
# no-tcp
|
||||
|
||||
# verbose
|
||||
no-stdout-log
|
||||
|
||||
## optional
|
||||
proc-user=root
|
||||
proc-group=root
|
||||
|
||||
```
|
||||
|
||||
You can validate here: https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
|
||||
|
||||
Setting this all up is easier said then done. good luck!
|
||||
52
turnserver2.conf
Normal file
52
turnserver2.conf
Normal file
@@ -0,0 +1,52 @@
|
||||
listening-port=3478
|
||||
alt-listening-port=3479
|
||||
|
||||
## TLS needs an SSL certificate and domain, but enables TCP
|
||||
tls-listening-port=443
|
||||
alt-tls-listening-port=444
|
||||
|
||||
# min-port=10000
|
||||
# max-port=20000
|
||||
|
||||
realm=www.turn.obs.ninja
|
||||
server-name=www.turn.obs.ninja
|
||||
|
||||
fingerprint
|
||||
|
||||
## Lets just use Google since its more reliable
|
||||
no-stun
|
||||
|
||||
lt-cred-mech
|
||||
user=UUUUU:PPPPPPPPPPPPP
|
||||
|
||||
stale-nonce=600
|
||||
|
||||
## depreciated in newer coturn
|
||||
# no-loopback-peers
|
||||
|
||||
no-multicast-peers
|
||||
|
||||
## 1-gbps/100 users = 1mbps each
|
||||
total-quota=100
|
||||
|
||||
cert=/var/certs/turn_obs_ninja_chain.crt
|
||||
pkey=/var/certs/turn_obs_ninja.key
|
||||
|
||||
## Tweaks to fix some lets encrypt errors
|
||||
# cipher-list="ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384"
|
||||
# no-sslv3
|
||||
# no-tlsv1
|
||||
# no-tlsv1_1
|
||||
# no-tlsv1_2
|
||||
dh2066
|
||||
|
||||
# max-bps=650000
|
||||
# no-udp
|
||||
# no-tcp
|
||||
|
||||
#verbose
|
||||
no-stdout-log
|
||||
|
||||
## bypass the letsencrypt bug; easier than modifying the service
|
||||
#proc-user=root
|
||||
#proc-group=root
|
||||
Reference in New Issue
Block a user