簡體   English   中英

WebRTC / getUserMedia API 教程 - 多攝像頭

[英]Tutorial for WebRTC / getUserMedia API - multiple cams

有誰知道可以讓兩個用戶通過網絡攝像頭相互連接的 WebRTC / getUserMedia API 腳本的好教程?

一個合適的例子應該是Chatroulette,只是它不需要那么大。 並且應該可以在本地主機上創建它。

希望任何人都可以幫助我!

使用SimpleWebRTCSignaling 服務器來實現您的目標。 主站點上查找更多信息

您將需要 nodejs 來運行信令服務器,或者您可以使用simplewebrtc 信令服務器進行測試。

不過,屏幕共享僅適用於 HTTPS。

工作演示

<!DOCTYPE html>
<html>
    <head>
        <title>SimpleWebRTC Demo</title>
    </head>
    <body>
        <h1 id="title">Start a room</h1>
        <style>
            .videoContainer {
                position: relative;
                width: 200px;
                height: 150px;
            }
            .videoContainer video {
                position: absolute;
                width: 100%;
                height: 100%;
            }
            .volume_bar {
                position: absolute;
                width: 5px;
                height: 0px;
                right: 0px;
                bottom: 0px;
                background-color: #12acef;
            }
            #localScreenContainer {
                display: none;
            }
        </style>
        <button id="screenShareButton"></button>
        <p id="subTitle">(https required for screensaring to work)</p>
        <form id="createRoom">
            <input id="sessionInput"/>
            <button type="submit">Create it!</button>
        </form>
        <div class="videoContainer">
            <video id="localVideo" style="height: 150px;" oncontextmenu="return false;"></video>
            <div id="localVolume" class="volume_bar"></div>
        </div>
        <div id="localScreenContainer" class="videoContainer">
        </div>
        <div id="remotes"></div>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        <script src="latest.js"></script>
        <script>
            // grab the room from the URL
            var room = location.search && location.search.split('?')[1];

            // create our webrtc connection
            var webrtc = new SimpleWebRTC({
                // the id/element dom element that will hold "our" video
                localVideoEl: 'localVideo',
                // the id/element dom element that will hold remote videos
                remoteVideosEl: '',
                // immediately ask for camera access
                autoRequestMedia: true,
                debug: false,
                detectSpeakingEvents: true,
                autoAdjustMic: false
            });

            // when it's ready, join if we got a room from the URL
            webrtc.on('readyToCall', function () {
                // you can name it anything
                if (room) webrtc.joinRoom(room);
            });

            function showVolume(el, volume) {
                if (!el) return;
                if (volume < -45) { // vary between -45 and -20
                    el.style.height = '0px';
                } else if (volume > -20) {
                    el.style.height = '100%';
                } else {
                    el.style.height = '' + Math.floor((volume + 100) * 100 / 25 - 220) + '%';
                }
            }
            webrtc.on('channelMessage', function (peer, label, data) {
                if (data.type == 'volume') {
                    showVolume(document.getElementById('volume_' + peer.id), data.volume);
                }
            });
            webrtc.on('localScreenAdded', function (video) {
                console.log('localScreenAdded', video);
                video.onclick = function () {
                    video.style.width = video.videoWidth + 'px';
                    video.style.height = video.videoHeight + 'px';
                };
                document.getElementById('localScreenContainer').appendChild(video);
                $('#localScreenContainer').show();
            });
            webrtc.on('localScreenRemoved', function (video) {
                console.log('localScreenRemoved', video);
                document.getElementById('localScreenContainer').removeChild(video);
                $('#localScreenContainer').hide();
            });
            webrtc.on('videoAdded', function (video, peer) {
                console.log('video added', peer);
                var remotes = document.getElementById('remotes');
                if (remotes) {
                    var d = document.createElement('div');
                    d.className = 'videoContainer';
                    d.id = 'container_' + webrtc.getDomId(peer);
                    d.appendChild(video);
                    var vol = document.createElement('div');
                    vol.id = 'volume_' + peer.id;
                    vol.className = 'volume_bar';
                    video.onclick = function () {
                        video.style.width = video.videoWidth + 'px';
                        video.style.height = video.videoHeight + 'px';
                    };
                    d.appendChild(vol);
                    remotes.appendChild(d);
                }
            });
            webrtc.on('videoRemoved', function (video, peer) {
                console.log('video removed ', peer);
                var remotes = document.getElementById('remotes');
                var el = document.getElementById('container_' + webrtc.getDomId(peer));
                if (remotes && el) {
                    remotes.removeChild(el);
                }
            });
            webrtc.on('volumeChange', function (volume, treshold) {
                //console.log('own volume', volume);
                showVolume(document.getElementById('localVolume'), volume);
            });

            // Since we use this twice we put it here
            function setRoom(name) {
                $('form').remove();
                $('h1').text(name);
                $('#subTitle').text('Link to join: ' + location.href);
                $('body').addClass('active');
            }

            if (room) {
                setRoom(room);
            } else {
                $('form').submit(function () {
                    var val = $('#sessionInput').val().toLowerCase().replace(/\s/g, '-').replace(/[^A-Za-z0-9_\-]/g, '');
                    webrtc.createRoom(val, function (err, name) {
                        console.log(' create room cb', arguments);

                        var newUrl = location.pathname + '?' + name;
                        if (!err) {
                            history.replaceState({foo: 'bar'}, null, newUrl);
                            setRoom(name);
                        } else {
                            console.log(err);
                        }
                    });
                    return false;          
                });
            }

            var button = $('#screenShareButton'),
                setButton = function (bool) {
                    button.text(bool ? 'share screen' : 'stop sharing');
                };
            webrtc.on('localScreenRemoved', function () {
                setButton(true);
            });

            setButton(true);

            button.click(function () {
                if (webrtc.getLocalScreen()) {
                    webrtc.stopScreenShare();
                    setButton(true);
                } else {
                    webrtc.shareScreen(function (err) {
                        if (err) {
                            setButton(true);
                        } else {
                            setButton(false);
                        }
                    });

                }
            });
        </script>
    </body>
</html>

我寫了一個更長的 WebRTC 教程,它指導您完成所有必要的步驟來創建您自己的簡單視頻應用程序,包括信號。 不要被篇幅嚇到,我在里面放了很多代碼示例。 另外,@bwtrent 已經提到的網站對我有很大幫助。

你在這里有一個聊天的例子https://github.com/twelephone/rtcroulette

要使用多個攝像頭,請查看這個https://simpl.info/getusermedia/sources/

我不知道整個 webrtc,但我知道 1 行上的一個可怕的技巧請求訪問:

    var getUserMedia = navigator.mediaDevices.getUserMedia({video: true, audio:true})

Ant Media Server 是一個開源軟件,您可以在其中查看工作中的 webRTC 頁面示例。 有關 webRTC 示例頁面,請參閱; https://github.com/ant-media/StreamApp/tree/master/src/main/webapp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM