日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

利用peerjs轻松玩转webrtc

發(fā)布時(shí)間:2023/12/13 综合教程 46 生活家
生活随笔 收集整理的這篇文章主要介紹了 利用peerjs轻松玩转webrtc 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

 隨著5G技術(shù)的推廣,可以預(yù)見(jiàn)在不久的將來(lái)網(wǎng)速將得到極大提升,實(shí)時(shí)音視頻互動(dòng)這類對(duì)網(wǎng)絡(luò)傳輸質(zhì)量要求較高的應(yīng)用將是最直接的受益者。而且伴隨著webrtc技術(shù)的成熟,該領(lǐng)域可能將成為下一個(gè)技術(shù)熱點(diǎn),但是傳統(tǒng)的webrtc應(yīng)用開(kāi)發(fā)存在一定的復(fù)雜性,本文將介紹如何利用peerjs這一開(kāi)源框架來(lái)簡(jiǎn)化webrtc開(kāi)發(fā)。

一、webrtc回顧
WebRTC(Web Real-Time Communication)即:網(wǎng)頁(yè)即時(shí)通信。 簡(jiǎn)單點(diǎn)講,它可以實(shí)現(xiàn)瀏覽器網(wǎng)頁(yè)與網(wǎng)頁(yè)之間的音視頻實(shí)時(shí)通信(或傳輸其它任何數(shù)據(jù)),目前主流瀏覽器都支持該API,WebRTC現(xiàn)在已經(jīng)納入W3C標(biāo)準(zhǔn)。

1.1 媒體協(xié)商
通信的主要目的之一是彼此交換信息。打個(gè)比方:“張三”跟“李四”打了一通電話(語(yǔ)音通訊),整個(gè)過(guò)程中“張三”說(shuō)的話被“李四”聽(tīng)到了,“李四”說(shuō)的話被“張三”聽(tīng)到了,雙方交換了語(yǔ)音信息。類似的,一個(gè)瀏覽器要與另一個(gè)瀏覽器發(fā)起實(shí)時(shí)音視頻通信,需要交換哪些信息呢? 除了音視頻信息外,至少還有2個(gè)關(guān)鍵信息要交換:媒體信息和網(wǎng)絡(luò)信息。

如上圖:通常某個(gè)瀏覽器所在的電腦,都會(huì)連接具體的多媒體設(shè)備(比如:麥克風(fēng)、攝像頭)。如果A電腦上的攝像頭只支持VP8,H264格式,而另一臺(tái)電腦上的攝像頭只支持H264、MPEG-4格式,它倆要能正常播放彼此的視頻,肯定會(huì)選擇雙方都能識(shí)別的H264格式。這就好比:2個(gè)不同國(guó)籍的人要相互交流,A會(huì)說(shuō)英語(yǔ)、中文;而B(niǎo)只會(huì)說(shuō)英語(yǔ),毫無(wú)懸念,他倆肯定會(huì)用雙方都能聽(tīng)懂的“英語(yǔ)”來(lái)溝通。

網(wǎng)絡(luò)情況也是類似的,二個(gè)瀏覽器所在的電腦可能在不同的網(wǎng)絡(luò)環(huán)境中,假如A機(jī)器具備公網(wǎng)+192內(nèi)網(wǎng)網(wǎng)段,而B(niǎo)機(jī)器只有192+198內(nèi)網(wǎng)網(wǎng)段,二臺(tái)電腦要能相互連接,很容易想到,使用雙方都能連通的公共192內(nèi)網(wǎng)網(wǎng)段通信最為方便。
在webrtc中,有一個(gè)特定的協(xié)議用于描述媒體信息、網(wǎng)絡(luò)信息和其它一些關(guān)鍵信息,稱為SDP(Session Description Protocol-會(huì)話描述協(xié)議)。而上述介紹的交換媒體信息、網(wǎng)絡(luò)信息的過(guò)程,也被稱為媒體協(xié)商,即:交換SDP.

這是一張媒體協(xié)商過(guò)程的經(jīng)典圖例, Amy要跟Bob通信, 要先發(fā)一個(gè)Offer(即: 描述Amy自己會(huì)話的SDP), Bob收到后,做出Answer回應(yīng)(即:描述Bob自己會(huì)話的SDP), 雙方完成SDP交換后, 根據(jù)前面的分析,取出二份SDP的交集, 即完成了媒體協(xié)商.

1.2 主要處理過(guò)程

這是mozilla開(kāi)發(fā)者官網(wǎng)上的一張圖, 大致描述了webrtc的處理過(guò)程:

A通過(guò)STUN服務(wù)器,收集自己的網(wǎng)絡(luò)信息
A創(chuàng)建Offer SDP,通過(guò)Signal Channel(信令服務(wù)器)給到B
B做出回應(yīng)生成Answer SDP,通過(guò)Signal Channel給到A
B通過(guò)STUN收集自己的網(wǎng)絡(luò)信息,通過(guò)Signal Channel給到A

注:如果A,B之間無(wú)法直接穿透(即:無(wú)法建立點(diǎn)對(duì)點(diǎn)的P2P直連),將通過(guò)TURN服務(wù)器中轉(zhuǎn)。

二、peerjs介紹
從上面的回顧可以看出,要?jiǎng)?chuàng)建一個(gè)真正的webrtc應(yīng)用還是有些小復(fù)雜的,特別是SDP交換(createOffer及createAnswer)、網(wǎng)絡(luò)候選信息收集(ICE candidate),這些都需要開(kāi)發(fā)人員對(duì)webrtc的機(jī)制有足夠的了解,對(duì)webrtc初學(xué)者來(lái)講有一定的開(kāi)發(fā)門檻。

而peerjs開(kāi)源項(xiàng)目簡(jiǎn)化了webrtc的開(kāi)發(fā)過(guò)程,把SDP交換、ICE candidate這些偏底層的細(xì)節(jié)都做了封裝,開(kāi)發(fā)人員只需要關(guān)注應(yīng)用本身就行了。
peerjs的核心對(duì)象Peer,它有幾個(gè)常用方法:

peer.connect 創(chuàng)建點(diǎn)對(duì)點(diǎn)的連接
peer.call 向另1個(gè)peer端發(fā)起音視頻實(shí)時(shí)通信
peer.on 對(duì)各種事件的監(jiān)控回調(diào)
peer.disconnect 斷開(kāi)連接
peer.reconnect 重新連接
peer.destroy 銷毀對(duì)象

另外還有二個(gè)重要對(duì)象DataConnection、MediaConnection,其中:

DataConnection用于收發(fā)數(shù)據(jù)(對(duì)應(yīng)于webrtc中的DataChannel),它的所有方法中有一個(gè)重要的send方法,用于向另一個(gè)peer端發(fā)送數(shù)據(jù);
MediaConnection用于處理媒體流,它有一個(gè)重要的stream屬性,表示關(guān)聯(lián)的媒體流。

更多細(xì)節(jié)可查閱peerjs的api在線文檔 (注:peerjs的所有api只有一頁(yè),估計(jì)15分鐘左右就全部看一圈)

peerjs的服務(wù)端(即信令服務(wù)器)很簡(jiǎn)單,只需要下面這段nodejs代碼即可:

var fs = require('fs');
var PeerServer = require('peer').PeerServer;

var options = {
  //webrtc要求SSL安全傳輸,所以要設(shè)置證書(shū)
  key: fs.readFileSync('key/server.key'),
  cert: fs.readFileSync('key/server.crt')
}

var server = PeerServer({
  port: 9000,
  ssl: options,
  path:"/"
});

本地啟用成功后,瀏覽https://localhost:9000 可以看到

三、實(shí)戰(zhàn)練習(xí)
下面選幾個(gè)常用的場(chǎng)景,利用peerjs實(shí)戰(zhàn)一番(文末最后有示例源碼鏈接) - 注:建議使用chrome谷歌瀏覽器運(yùn)行下面的示例。

3.1 文本聊天
運(yùn)行效果如下(假設(shè)有Jack、Rose二個(gè)用戶在各自的瀏覽器頁(yè)面上相互聊天)

主要流程:

Jack和Rose先連接到PeerJs服務(wù)器
Rose指定要建立p2p連接的對(duì)方名稱(即:Jack),然后發(fā)送消息
Jack在自己的頁(yè)面上,可以實(shí)時(shí)收到Rose發(fā)送過(guò)來(lái)的文字,并回復(fù)

客戶端的js代碼如下:(不到100行)

var txtSelfId = document.querySelector("input#txtSelfId");
var txtTargetId = document.querySelector("input#txtTargetId");
var txtMsg = document.querySelector("input#txtMsg");
var tdBox = document.querySelector("td#tdBox");
var btnRegister = document.querySelector("button#btnRegister");
var btnSend = document.querySelector("button#btnSend");

let peer = null;
let conn = null;

//peer連接時(shí),id不允許有中文,所以轉(zhuǎn)換成hashcode數(shù)字
hashCode = function (str) {
    var hash = 0;
    if (str.length == 0) return hash;
    for (i = 0; i < str.length; i++) {
        char = str.charCodeAt(i);
        hash = ((hash << 5) - hash) + char;
        hash = hash & hash;
    }
    return hash;
}

sendMessage = function (message) {
    conn.send(JSON.stringify(message));
    console.log(message);
    tdBox.innerHTML = tdBox.innerHTML += "<div class='align_left'>" + message.from + " : " + message.body + "</div>";
}

window.onload = function () {

    //peerserver的連接選項(xiàng)(debug:3表示打開(kāi)調(diào)試,將在瀏覽器的console輸出詳細(xì)日志)
    let connOption = { host: 'localhost', port: 9000, path: '/', debug: 3 };

    //register處理
    btnRegister.onclick = function () {
        if (!peer) {
            if (txtSelfId.value.length == 0) {
                alert("please input your name");
                txtSelfId.focus();
                return;
            }
            //創(chuàng)建peer實(shí)例 
            peer = new Peer(hashCode(txtSelfId.value), connOption);

            //register成功的回調(diào)
            peer.on('open', function (id) {
                tdBox.innerHTML = tdBox.innerHTML += "<div class='align_right'>system : register success " + id + "</div>";
            });

            peer.on('connection', (conn) => {
                //收到對(duì)方消息的回調(diào)
                conn.on('data', (data) => {
                    var msg = JSON.parse(data);
                    tdBox.innerHTML = tdBox.innerHTML += "<div class='align_right'>" + msg.from + " : " + msg.body + "</div>";
                    if (txtTargetId.value.length == 0) {
                        txtTargetId.value = msg.from;
                    }
                });
            });
        }
    }

    //發(fā)送消息處理
    btnSend.onclick = function () {
        //消息體
        var message = { "from": txtSelfId.value, "to": txtTargetId.value, "body": txtMsg.value };
        if (!conn) {
            if (txtTargetId.value.length == 0) {
                alert("please input target name");
                txtTargetId.focus();
                return;
            }
            if (txtMsg.value.length == 0) {
                alert("please input message");
                txtMsg.focus();
                return;
            }

            //創(chuàng)建到對(duì)方的連接
            conn = peer.connect(hashCode(txtTargetId.value));
            conn.on('open', () => {
                //首次發(fā)送消息
                sendMessage(message);
            });
        }

        //發(fā)送消息
        if (conn.open) {
            sendMessage(message);
        }
    }
}

有幾點(diǎn)說(shuō)明一下:

89行首次發(fā)送消息,這時(shí)conn還沒(méi)有準(zhǔn)備好(open狀態(tài)為false),此時(shí)send不會(huì)成功,參考下面的調(diào)試截圖


要在conn.on('open',{...})事件回調(diào)里完成首次消息的發(fā)送,這時(shí)候open狀態(tài)是true,send才能成功

從瀏覽器的console控制臺(tái)日志可以清楚的看到peerjs,已經(jīng)把createOffer、createAnswer,以及ICE candidate這些細(xì)節(jié)都內(nèi)部消化掉了。

這是Rose端的日志

這是Jack端的日志

從日志可以看到,剛開(kāi)始Rose→Create Offer->Jack,然后Jack→Create Answer→ Rose,Rose→Jack的連接建立好了; Jack收到第一句話"how are you"后,回復(fù)"fine, thank you"時(shí), 過(guò)程反過(guò)來(lái) Jack → Create Offer → Rose,然后Rose → Create Answer → Jack, Jack→Rose的連接也建好了,后面再聊天,就可以直接相互send文字消息了。另外ICE candidate 、set localDescription、set remoteDescription這些peerjs也一并幫我們做掉了,對(duì)普通開(kāi)發(fā)人員而言,不再需要關(guān)心這些細(xì)節(jié)。強(qiáng)烈建議大家將這2份日志與“第1部分Amy與Bob交換SDP"那張圖對(duì)照體會(huì)一下。

另外,雖然這個(gè)示例是在本機(jī)運(yùn)行的,但是原理跟2臺(tái)不同的電腦之間(或不同的網(wǎng)絡(luò)環(huán)境,比如Rose在美國(guó)、Jack在中國(guó))端對(duì)端通信是完全相同的,只不過(guò)如果二端的瀏覽器如果不在一個(gè)網(wǎng)段,需要配置stun或turn服務(wù)器,參考下面的配置:

var peer = new Peer({
  config: {'iceServers': [
    { url: 'stun:stun.l.google.com:19302' },
    { url: 'turn:homeo@turn.bistri.com:80', credential: 'homeo' }
  ]} /* Sample servers, please use appropriate ones */
});

注:關(guān)于stun或turn的細(xì)節(jié),建議閱讀本文最后的參考文章。

3.2 視頻通話
運(yùn)行效果如下(視頻轉(zhuǎn)成gif文件尺寸太大,這里就只截了幾張運(yùn)行中的關(guān)鍵圖片)

注:為了模擬2個(gè)人分別在不同的頁(yè)面實(shí)時(shí)視頻通話, 我在本機(jī)插了2個(gè)USB攝像頭(1個(gè)橫著放,1個(gè)豎著放),打開(kāi)2個(gè)瀏覽器頁(yè)面并啟用攝像頭后,1個(gè)頁(yè)面選擇攝像頭1,另1個(gè)頁(yè)面選擇攝像頭2(通過(guò)下圖中攝像頭下拉框切換)。

如上圖,在1個(gè)頁(yè)面上輸入”張三“并點(diǎn)擊register,同時(shí)允許使用攝像頭,然后在另1個(gè)頁(yè)面輸入”李四“,也點(diǎn)擊register,并允許使用攝像頭,然后把攝像頭切換到另1個(gè),這樣2個(gè)頁(yè)面看到的本地視頻就不一樣了(相當(dāng)于2個(gè)端各自的視頻流)。然后在"李四"的頁(yè)面上,target name這里輸入"張三",并點(diǎn)擊call按鈕發(fā)起視頻通話,此時(shí)"張三"的頁(yè)面上會(huì)馬上收到邀請(qǐng)確認(rèn)(如下圖)

”張三“選擇Accept同意后,二端就相互建立連接,開(kāi)始實(shí)時(shí)視頻通話。

注:首次運(yùn)行時(shí),瀏覽器會(huì)彈出類似下圖的提示框詢問(wèn)是否同意啟用攝像頭/麥克風(fēng)(出于安全隱私考慮),如果手一抖選擇了不允許,就算刷新頁(yè)面,也不會(huì)再?gòu)棾鎏崾究颉?/p>

對(duì)于chrome瀏覽器,可在"設(shè)置→ 高級(jí)→ 內(nèi)容設(shè)置→ 攝像頭/麥克風(fēng)" 手動(dòng)重新設(shè)置。

從上面這一系列的運(yùn)行截圖可以看到,“李四”與“張三”在發(fā)起視頻通話過(guò)程中涉及到一些交互(即:“李四”發(fā)起,“張三”可以選擇同意或拒絕),這些交互的指令(也稱為"信令")可以通過(guò)上一個(gè)場(chǎng)景"文字聊天"中的聊天消息Message作為載體,簡(jiǎn)單起見(jiàn),message可以用一個(gè)json格式來(lái)表示:

{
    "from": "李四",
    "to": "張三",
    "action": "call"
}

action代表具體的指令動(dòng)作類型,在這個(gè)場(chǎng)景中有3個(gè):call(發(fā)起視頻通話),accept(對(duì)方同意視頻通話),accept-ok(發(fā)起方通知對(duì)方接收媒體流)-注:指令類型的名字可以隨便起,不一定非得叫call/accept/accept-ok,容易理解即可。

關(guān)鍵的幾處代碼如下:call按鈕的處理邏輯

btnCall.onclick = function () {
    if (txtTargetId.value.length == 0) {
        alert("please input target name");
        txtTargetId.focus();
        return;
    }
    sendMessage(txtSelfId.value, txtTargetId.value, "call");
}

其中sendMessage即發(fā)送消息

function sendMessage(from, to, action) {
    var message = { "from": from, "to": to, "action": action };
    if (!localConn) {
        localConn = peer.connect(hashCode(to));
        localConn.on('open', () => {
            localConn.send(JSON.stringify(message));
            console.log(message);
        });
    }
    if (localConn.open){
        localConn.send(JSON.stringify(message));
        console.log(message);
    }
}

register按鈕處理邏輯:

//register處理
btnRegister.onclick = function () {
    if (!peer) {
        if (txtSelfId.value.length == 0) {
            alert("please input your name");
            txtSelfId.focus();
            return;
        }
        peer = new Peer(hashCode(txtSelfId.value), connOption);
        peer.on('open', function (id) {
            console.log("register success. " + id);
        });
        peer.on('call', function (call) {
            call.answer(localStream);
        });
        peer.on('connection', (conn) => {
            conn.on('data', (data) => {
                var msg = JSON.parse(data);
                console.log(msg);
                //“接收方“收到邀請(qǐng)時(shí),彈出詢問(wèn)對(duì)話框
                if (msg.action === "call") {
                    lblFrom.innerText = msg.from;
                    txtTargetId.value = msg.from;
                    $("#dialog-confirm").dialog({
                        resizable: false,
                        height: "auto",
                         400,
                        modal: true,
                        buttons: {
                            "Accept": function () {
                                $(this).dialog("close");
                                sendMessage(msg.to, msg.from, "accept");
                            },
                            Cancel: function () {
                                $(this).dialog("close");
                            }
                        }
                    });
                }
                 
                //“發(fā)起方“發(fā)起視頻call,并綁定媒體流
                if (msg.action === "accept") {
                    console.log("accept call => " + JSON.stringify(msg));
                    var call = peer.call(hashCode(msg.from), localStream);
                    call.on('stream', function (stream) {
                        console.log('received remote stream');
                        remoteVideo.srcObject = stream;
                        sendMessage(msg.to, msg.from, "accept-ok");
                    });
                }
 
                //"接收方"發(fā)起視頻call,并綁定媒體流   
                if (msg.action === "accept-ok") {
                    console.log("accept-ok call => " + JSON.stringify(msg));
                    var call = peer.call(hashCode(msg.from), localStream);
                    call.on('stream', function (stream) {
                        console.log('received remote stream');
                        remoteVideo.srcObject = stream;                           
                    });
                }
            });
        });
    }
}

  

3.3 白板共享
運(yùn)行效果如下:在2個(gè)頁(yè)面上,仍然模擬2個(gè)用戶“張三”與“李四”,都register到peerjs服務(wù)器后,輸入對(duì)方的名稱,然后點(diǎn)擊share,就可以在canvas上共享白板一起涂鴉了。

關(guān)鍵點(diǎn):send方法不僅僅可以用來(lái)發(fā)送文字消息,同樣也可以發(fā)送其它內(nèi)容,每次在canvas上的的涂鴉,本質(zhì)上就是調(diào)用canvas的api在一系列的坐標(biāo)點(diǎn)上連續(xù)畫(huà)線。只要把1個(gè)頁(yè)面上畫(huà)線經(jīng)過(guò)的坐標(biāo)點(diǎn)發(fā)送到另1個(gè)頁(yè)面上,再還原出來(lái)就可以了。

核心代碼:

window.onload = function () {
    if (!navigator.mediaDevices ||
        !navigator.mediaDevices.getUserMedia) {
        console.log('webrtc is not supported!');
        alert("webrtc is not supported!");
        return;
    }
 
    let connOption = { host: 'localhost', port: 9000, path: '/', debug: 3 };
 
    context = demoCanvas.getContext('2d');
 
    //canvas鼠標(biāo)按下的處理
    demoCanvas.onmousedown = function (e) {
        e.preventDefault();
        context.strokeStyle='#00f';
        context.beginPath();
        started = true;
        buffer.push({ "x": e.offsetX, "y": e.offsetY });
    }
 
     //canvas鼠標(biāo)移動(dòng)的處理
    demoCanvas.onmousemove = function (e) {
        if (started) {
            context.lineTo(e.offsetX, e.offsetY);
            context.stroke();
            buffer.push({ "x": e.offsetX, "y": e.offsetY });
        }
    }
 
     //canvas鼠標(biāo)抬起的處理
    demoCanvas.onmouseup = function (e) {
        if (started) {
            started = false;
            //鼠標(biāo)抬起時(shí),發(fā)送坐標(biāo)數(shù)據(jù)
            sendData(txtSelfId.value, txtTargetId.value, buffer);
            buffer = [];
        }
    }
 
    //register按鈕處理
    btnRegister.onclick = function () {
        if (!peer) {
            if (txtSelfId.value.length == 0) {
                alert("please input your name");
                txtSelfId.focus();
                return;
            }
            peer = new Peer(hashCode(txtSelfId.value), connOption);
            peer.on('open', function (id) {
                console.log("register success. " + id);
            });
            peer.on('connection', (conn) => {
                conn.on('data', (data) => {
                    let msg = JSON.parse(data);
                    console.log(msg);
                    txtTargetId.value = msg.from;
                    //還原canvas
                    context.strokeStyle='#f00';
                    context.beginPath();
                    context.moveTo(msg.data[0].x,msg.data[0].y);
                    for (const pos in msg.data) {
                        context.lineTo(msg.data[pos].x,msg.data[pos].y);
                    }
                    context.stroke();
                });
            });
        }
    }
 
    //share按鈕處理
    btnShare.onclick = function () {
        if (txtTargetId.value.length == 0) {
            alert("please input target name");
            txtTargetId.focus();
            return;
        }
    }
    start();
}

其中sendData方法如下:

function sendData(from, to, data) {
    if (from.length == 0 || to.length == 0 || data.length == 0) {
        return;
    }
    let message = { "from": from, "to": to, "data": data };
    if (!localConn) {
        localConn = peer.connect(hashCode(to));
        localConn.on('open', () => {
            localConn.send(JSON.stringify(message));
            console.log(message);
        });
    }
    if (localConn.open) {
        localConn.send(JSON.stringify(message));
        console.log(message);
    }
}

說(shuō)明一下:這里我們用一個(gè)buffer數(shù)組來(lái)保存每次畫(huà)線的坐數(shù),然后在畫(huà)線結(jié)束時(shí),再調(diào)用sendData發(fā)送到對(duì)方。

3.4 圖片傳輸
運(yùn)行效果:在2個(gè)瀏覽器頁(yè)面上,分別register2個(gè)用戶,然后在其中1個(gè)頁(yè)面上,輸入對(duì)方的名字,然后選擇一張圖片,另1個(gè)頁(yè)面將會(huì)收到傳過(guò)來(lái)的圖片。

核心仍然利用的是DataConnection的send方法,只不過(guò)發(fā)送的內(nèi)容里包含了圖片對(duì)應(yīng)的blob對(duì)象,核心代碼如下:

btnRegister.onclick = function () {
    if (!peer) {
        if (txtSelfId.value.length == 0) {
            alert("please input your name");
            txtSelfId.focus();
            return;
        }
        peer = new Peer(hashCode(txtSelfId.value), connOption);
        peer.on('open', function (id) {
            console.log("register success. " + id);
            lblStatus.innerHTML = "scoket open"
        });
 
        peer.on('connection', (conn) => {
            conn.on('data', (data) => {
                console.log("receive remote data");
                lblStatus.innerHTML = "receive data from " + data.from;
                txtTargetId.value = data.from
                if (data.filetype.includes('image')) {
                    lblStatus.innerHTML = data.filename + "(" + data.filetype + ") from:" + data.from
                    const bytes = new Uint8Array(data.file)
                    //用base64編碼,還原圖片
                    img.src = 'data:image/png;base64,' + encode(bytes)
                }
            });
        });
    }
}
 
//文件變化時(shí),觸發(fā)sendFile
inputFile.onchange = function (event) {
    if (txtTargetId.value.length == 0) {
        alert("please input target name");
        txtTargetId.focus();
        return;
    }
    const file = event.target.files[0]  
    //構(gòu)造圖片對(duì)應(yīng)的blob對(duì)象    
    const blob = new Blob(event.target.files, { type: file.type });
    img.src = window.URL.createObjectURL(file);
    sendFile(txtSelfId.value, txtTargetId.value, blob, file.name, file.type);
}

sendFile方法如下:

function sendFile(from, to, blob, fileName, fileType) {
    var message = { "from": from, "to": to, "file": blob, "filename": fileName, "filetype": fileType };
    if (!localConn) {
        localConn = peer.connect(hashCode(to));
        localConn.on('open', () => {
            localConn.send(message);
            console.log('onopen sendfile');
        });
    }
    localConn.send(message);
    console.log('send file');
}

上述示例的源碼已上傳至github,地址:https://github.com/yjmyzz/peerjs-sample

參考文章:

https://hpbn.co/webrtc/
https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Connectivity
https://peerjs.com/docs.html
https://www.cnblogs.com/yjmyzz/p/how-to-install-coturn-on-ubuntu.html
https://webrtc.github.io/samples/

總結(jié)

以上是生活随笔為你收集整理的利用peerjs轻松玩转webrtc的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

国产在线精品观看 | 字幕网资源站中文字幕 | 五月天狠狠操 | 亚洲成免费 | 美女黄久久 | 91成人看片 | 日韩乱码在线 | 欧美日韩久久一区 | 中文免费 | 日韩精品一区二区三区水蜜桃 | 久久亚洲影视 | 精品在线免费视频 | 亚洲色图激情文学 | 91精品999| 午夜视频在线观看网站 | 国产精品视频不卡 | 久草精品视频在线播放 | 天天操夜夜曰 | 在线播放国产一区二区三区 | 久久综合免费 | 国产一区视频导航 | 日本最新高清不卡中文字幕 | 四虎天堂 | 99精品一区二区 | av不卡在线看 | 99在线免费视频 | 久久久久久久久久影视 | av色一区| 少妇bbb好爽 | 一区免费视频 | 免费在线色视频 | 欧美孕交vivoestv另类 | 在线观看日韩精品视频 | 天天操天天添 | 免费a一级 | 婷婷丁香视频 | 精品免费久久 | 国产一区高清在线 | 国产91精品一区二区麻豆网站 | 国产成人久久av免费高清密臂 | 99久热 | 91看国产| 日韩免费视频一区二区 | 国产视| 日本韩国精品一区二区在线观看 | 在线中文字幕视频 | 五月激情五月激情 | 亚洲视频免费在线 | 四虎国产精品成人免费影视 | 免费成人短视频 | 国产精品涩涩屋www在线观看 | 五月婷婷综合色拍 | 91九色国产在线 | 99色婷婷| 国产明星视频三级a三级点| 99久久精品国产欧美主题曲 | 欧美日韩视频在线播放 | 国内精品久久久久久久97牛牛 | 久久久久久久久久久久影院 | 国产精品美女免费 | 亚洲精品小区久久久久久 | 婷婷激情五月综合 | 亚洲区另类春色综合小说校园片 | 久久伊人精品一区二区三区 | av大全在线观看 | 日韩免费一级电影 | 91福利免费 | 国产一级a毛片视频爆浆 | 一区二区三区电影大全 | 精品国产乱码久久久久久天美 | 久久国产精品视频免费看 | 97福利在线观看 | 99精品热视频只有精品10 | 国产视频一区二区在线 | 99久久婷婷国产综合亚洲 | 欧美一级日韩免费不卡 | 国产精品原创av片国产免费 | 国产精品美女久久久久久久网站 | 国产不卡在线播放 | av综合在线观看 | 成年人黄色免费视频 | 看片网站黄| 久久免费av电影 | 国产精品色 | 色婷婷精品大在线视频 | 国产成人久久精品77777 | 在线观看日韩精品 | 久久九九网站 | 免费av在线播放 | 在线观看视频亚洲 | 国产精品久久久久久久久久免费看 | 国产精品毛片久久 | 天天插天天色 | 国产精品1区2区3区 久久免费视频7 | 久久久国产网站 | 激情影院在线观看 | 在线免费观看亚洲视频 | 欧美视频在线观看免费网址 | 欧美天堂久久 | 夜夜躁狠狠躁日日躁 | 国产精品专区在线观看 | 在线观看日韩免费视频 | 成人免费色 | 国产高清视频网 | 中文字幕你懂的 | 黄色app网站在线观看 | 欧美色伊人 | 国产在线观看xxx | 热久久最新地址 | 91视频午夜| 69国产精品视频免费观看 | 在线不卡视频 | 国外调教视频网站 | 69成人在线| 91xav| 国语精品久久 | 成人h动漫精品一区二 | 999热线在线观看 | 久久久婷 | 中文字幕在线一二 | 国产一区二区三精品久久久无广告 | 手机看片1042 | 精品久久久久久久久久久久 | 国产精品视频不卡 | 亚洲女同videos | 中文字幕 婷婷 | 在线视频 影院 | 五月激情久久久 | 人人干天天干 | 色天堂在线视频 | 免费观看一区二区 | 日韩一区二区三区观看 | 少妇自拍av | 久久久综合色 | 天堂视频一区 | 亚洲激情一区二区三区 | 亚洲精品久久久蜜桃 | www.天天综合| 国产精品成人自产拍在线观看 | 欧美在线久久 | 国产手机在线视频 | 高清精品久久 | 国产精品午夜免费福利视频 | 五月视频 | 色婷婷一区 | 精品国产伦一区二区三区观看说明 | 最新在线你懂的 | 日韩三级中文字幕 | 亚洲乱码精品久久久久 | 在线成人小视频 | 操老逼免费视频 | 天天综合日日夜夜 | 精品乱码一区二区三四区 | 亚洲精品在线二区 | 国产一二三四在线视频 | 国产高清在线永久 | 久久综合色一综合色88 | 日本成人中文字幕在线观看 | 少妇自拍av | 国产亚洲成人网 | 国产视频一二三 | 91成人短视频在线观看 | 在线观看av网| 波多野结衣小视频 | 国产精品12| 国产精品久久精品 | 成人黄色小说网 | 欧美精品一区在线发布 | 色婷婷中文 | 超碰97人 | 国产日韩精品视频 | 免费av片在线 | 国产精品原创av片国产免费 | 精品福利片 | 欧美日韩色婷婷 | 人人干人人超 | 久久国产精品精品国产色婷婷 | 国产一级免费在线 | 国产免费一区二区三区网站免费 | 久久日本视频 | 国产精品黄色 | 成人免费 在线播放 | 黄色av电影 | 天天干天天在线 | 久久精品三 | 日韩高清一| 色视频网站免费观看 | 日日爽日日操 | 黄色电影小说 | 日韩欧美网站 | 香蕉影院在线 | 久久午夜国产 | 精品国产一区二区在线 | 亚洲成年人在线播放 | 亚洲一区二区高潮无套美女 | 亚洲天堂色婷婷 | 精品久久久久久久久久久久久久久久久久 | 亚洲精品资源在线观看 | 国产精品成人一区二区 | 青草视频在线免费 | 国产精品久久久久久久久软件 | 成年人视频在线免费观看 | 中文字幕久久精品亚洲乱码 | 日韩视频一区二区在线 | 久久精品永久免费 | 黄色电影在线免费观看 | 色橹橹欧美在线观看视频高清 | 黄色录像av | 17videosex性欧美| 黄色资源网站 | 亚洲一区二区三区在线看 | 国产精品你懂的在线观看 | 狠狠狠狠狠狠干 | 国产高清av免费在线观看 | 香蕉视频色 | 国产精品久久久久三级 | 久久这里只有精品1 | 我要色综合天天 | 激情久久综合 | 97色在线| 午夜久久影视 | 国产精品一区二区免费在线观看 | 毛片精品免费在线观看 | 欧洲精品码一区二区三区免费看 | 日韩午夜小视频 | 国产黄色美女 | 国产女人18毛片水真多18精品 | av电影久久| 在线成人中文字幕 | 日韩在线视频线视频免费网站 | 色综合久久综合中文综合网 | 91色在线观看 | 久久视频免费看 | 欧美日韩视频在线观看一区二区 | 超碰公开在线 | 色综合小说| 国产在线2020 | 日本成人中文字幕在线观看 | 狠狠操操操 | 精品免费久久久久久 | www.久久爱.cn | 欧美日韩精品区 | av在线网站免费观看 | 91麻豆精品91久久久久同性 | 日韩亚洲国产中文字幕 | 在线免费成人 | 日韩电影中文,亚洲精品乱码 | 五月婷香蕉久色在线看 | 久久久久久久久免费 | 国产麻豆视频网站 | 国产精品女主播一区二区三区 | 美女在线免费观看视频 | 中文字幕在线视频一区二区 | 亚洲一区视频免费观看 | 国产99久久久国产精品免费二区 | 人人要人人澡人人爽人人dvd | 国产成人777777| 国产成人av网站 | 国产高h视频 | 久久精品麻豆 | 天天玩天天操天天射 | 91亚洲精品国偷拍自产在线观看 | 成人免费网视频 | 久久tv| 国产高清免费在线播放 | 最近日本字幕mv免费观看在线 | 日日干美女 | 人人干天天射 | 精品91久久久久 | 国产福利午夜 | 91电影福利 | 国产无套一区二区三区久久 | 91视频专区| 亚洲乱亚洲乱妇 | 久久精品视频一 | 免费毛片aaaaaa | 欧美精品一区二区三区一线天视频 | 亚洲性少妇性猛交wwww乱大交 | 天天综合精品 | 日本午夜在线亚洲.国产 | 99久久99久久精品国产片 | 中文字幕第一页在线视频 | 免费观看国产视频 | 久久久在线免费观看 | 精品av在线播放 | adc在线观看 | 特及黄色片 | 国产福利av在线 | 亚洲欧美一区二区三区孕妇写真 | 国产又黄又爽无遮挡 | 久久久免费精品视频 | 激情久久久久久久久久久久久久久久 | 日日操夜| 亚洲久草网 | 免费观看完整版无人区 | 久久精精品视频 | 国产中文在线字幕 | 97在线免费 | 国产精品久久久久久久久久免费 | 国产区久久 | 国产不卡在线看 | 中文字幕一区二区在线播放 | 五月婷婷另类国产 | 亚洲人成人在线 | av中文字幕av | 国产精品国产亚洲精品看不卡15 | 国产精品久久久久久久av大片 | 欧美日韩国产综合一区二区 | 免费观看性生活大片3 | 日本成人a | 国产免费亚洲高清 | 精品99免费| 亚洲伊人网在线观看 | 超碰成人av | 三级av在线免费观看 | 久久精品精品电影网 | 亚洲精品国产精品乱码在线观看 | 国产午夜精品视频 | 在线免费观看一区二区三区 | 精产嫩模国品一二三区 | 久草免费看| 国产一区免费观看 | 在线播放 日韩专区 | 亚洲欧美激情插 | 成年人在线视频观看 | 24小时日本在线www免费的 | 五月婷久 | 欧美久久电影 | 免费看黄在线看 | 久久精品www人人爽人人 | www.久热| 成人看片 | 免费av小说| 久久成人精品电影 | 久久久一本精品99久久精品66 | 成年人免费观看在线视频 | 国产精品久久久久av福利动漫 | 国产一区二区视频在线播放 | 久久人人97超碰com | 免费网站看av片 | 人人草人人草 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 成人小视频在线观看免费 | 97在线视频免费看 | 丁香花五月 | 手机在线看片日韩 | 免费精品在线视频 | 六月天色婷婷 | 日韩av线观看 | 日韩a级免费视频 | 欧美日韩国产精品一区 | 在线观看蜜桃视频 | 免费av福利 | 色偷偷中文字幕 | 色综合五月天 | 人人爱爱 | 二区在线播放 | 国产精品毛片一区视频播不卡 | 色操插 | 国产理论影院 | 99热精品在线 | 国产精品免费在线 | 又粗又长又大又爽又黄少妇毛片 | 久久久国产在线视频 | 久久国产高清视频 | 激情丁香在线 | 精品在线观| 中文字幕丝袜制服 | 国产亚洲精品精品精品 | 欧美大片mv免费 | 国产一区二区在线影院 | 在线观看视频免费大全 | 亚洲精品xx | 国产精品欧美久久久久无广告 | 日韩在线免费电影 | 人人澡人人模 | 日韩成年视频 | 久久精品日韩 | 91在线色 | 天天操天天操天天操天天操 | av电影免费在线 | 一区二区欧美日韩 | 在线观看黄污 | 日韩精品一区二区久久 | 国产成人精品在线观看 | 欧美激情第八页 | 久久久免费看视频 | 欧美大片大全 | 国产精品一区二区久久精品爱微奶 | a级国产乱理论片在线观看 伊人宗合网 | 日韩视频图片 | 国产精品美乳一区二区免费 | 免费看一及片 | 久久久久久麻豆 | www.夜夜爽| 亚洲精品国产欧美在线观看 | 亚洲国产电影在线观看 | japanesexxxhd奶水 国产一区二区在线免费观看 | 天天爽网站 | 91女子私密保健养生少妇 | 天天干天天在线 | 99色在线观看 | 超碰在97| 日韩欧美xxx | 亚洲一级片av | 国产亚州av | 91传媒激情理伦片 | 国产午夜三级 | 五月天视频网 | 久久综合五月 | 久草视频资源 | 欧美日韩国产一区二区三区在线观看 | 香蕉视频4aa| 亚洲激情网站免费观看 | 日韩在线三区 | 在线黄色国产电影 | 成年人在线免费看视频 | 国产午夜视频在线观看 | 91精品国产自产老师啪 | 日韩专区 在线 | 四虎影视成人永久免费观看亚洲欧美 | 伊人中文字幕在线 | 精品国产自 | 黄色特级一级片 | 欧美最新大片在线看 | 国产日韩欧美在线观看视频 | av青草| 91九色综合| 欧美肥妇free | 超碰免费97| 九九色网 | 国产亚洲精品成人av久久影院 | 手机看片中文字幕 | 中文字幕国产亚洲 | 久久99精品国产 | 亚洲天堂网在线视频观看 | 99激情网| 国产精品毛片一区二区在线看 | 99看视频在线观看 | 黄色亚洲大片免费在线观看 | 97色狠狠 | 国产一级a毛片视频爆浆 | 欧美一区二区三区不卡 | 91精品国产亚洲 | 久久99国产精品二区护士 | 免费影视大全推荐 | 在线精品视频免费播放 | 国产一级大片在线观看 | 在线日本看片免费人成视久网 | 国产高清亚洲 | 在线91精品 | 免费在线观看av网站 | 香蕉网在线播放 | 在线国产福利 | 91九色蝌蚪在线 | 国产免费视频一区二区裸体 | 93久久精品日日躁夜夜躁欧美 | 一区二区三区手机在线观看 | 中文字幕色在线 | 激情视频一区二区三区 | 国产精品理论视频 | 在线观看一 | 精品国产电影 | 国产视频69 | 亚洲电影久久 | 午夜美女福利 | 日本黄色片一区二区 | 亚洲国产精品电影 | 99热在 | 激情婷婷综合 | 日韩亚洲国产精品 | 中文字幕亚洲欧美 | 99麻豆视频 | 最近日本韩国中文字幕 | 国产精品一区二区 91 | 久久精品久久99精品久久 | 日韩免费视频在线观看 | 97超碰国产精品 | 亚洲国产视频网站 | www.精选视频.com | 另类五月激情 | 91欧美在线| 精品国产一二三 | 亚洲一级黄色片 | 中文字幕永久 | 丁香资源影视免费观看 | 在线探花| 九九九九免费视频 | 午夜免费视频网站 | 黄色av网站在线观看免费 | 日日夜夜狠狠操 | 国产偷国产偷亚洲清高 | 九九热在线观看视频 | 日韩大片在线免费观看 | 亚洲免费a | 国产一区二区久久 | 视频在线99re | 日韩在线观看你懂的 | 亚洲va天堂va欧美ⅴa在线 | 国产最新视频在线观看 | 在线观看一级片 | 蜜臀av免费一区二区三区 | 91精品视频免费在线观看 | 樱空桃av | 一区二区精 | 91丨九色丨国产在线 | 欧美一区二区三区不卡 | 日韩成人av在线 | 视频在线观看入口黄最新永久免费国产 | 中文字幕的| 四川妇女搡bbbb搡bbbb搡 | 97伊人网 | 99热手机在线 | 午夜黄色大片 | 久久字幕网 | 国产一区二区三区免费在线 | 国产一二三四在线观看视频 | 久草视频资源 | 日批视频国产 | 高清av免费观看 | 亚洲涩涩网 | 91精品一区在线观看 | 午夜视频一区二区三区 | 亚洲 欧美 国产 va在线影院 | 免费观看一级成人毛片 | 亚洲高清在线 | 色婷婷综合久久久久中文字幕1 | 蜜桃视频日韩 | 国产高清视频 | 婷婷色中文字幕 | 在线视频18在线视频4k | 五月婷婷激情网 | 中文区中文字幕免费看 | 国产在线探花 | 精品日韩在线 | 国产精品一区二区三区四 | 草久视频在线 | 国产亚洲免费的视频看 | 国产五月色婷婷六月丁香视频 | 久久在线免费视频 | 亚洲精品玖玖玖av在线看 | 午夜av激情 | 尤物一区二区三区 | 欧美日韩一级久久久久久免费看 | 精品久久久久国产免费第一页 | 久久久久久久久久久免费av | 久久99国产综合精品免费 | 91精品国产自产老师啪 | 久久免费一 | 欧美日韩国产综合网 | 97视频在线免费观看 | 91精品在线播放 | 国产午夜精品一区二区三区四区 | 国产在线观看高清视频 | 91污污视频在线观看 | 最新黄色av网址 | 免费麻豆视频 | 日韩av成人在线观看 | 久草视频在线新免费 | 日韩精品首页 | 久久久久成人免费 | 天天操天天综合网 | 国产一区二区在线影院 | 天天操天天干天天操天天干 | 日韩在线免费高清视频 | 天天爽夜夜爽人人爽一区二区 | 国内精品久久天天躁人人爽 | 久操视频在线观看 | 91香蕉视频色版 | 亚洲国内精品视频 | 首页av在线 | 开心激情五月婷婷 | 五月婷婷一区二区三区 | 中文av在线天堂 | av综合站 | 色就色,综合激情 | 91在线在线观看 | 色多视频在线观看 | 97电影网站| 亚洲免费不卡 | 国产美女主播精品一区二区三区 | 91精品国产麻豆国产自产影视 | 亚洲激情中文 | av免费看在线 | 国产精品高 | 久久a久久 | 在线观看一级片 | 国产精品一区二区在线看 | 久久久久成人精品 | 亚洲欧美国内爽妇网 | 免费看黄在线观看 | 能在线观看的日韩av | 在线精品观看 | 欧美日韩在线免费观看 | 日本公乱妇视频 | 国产精品a久久 | 国产综合在线视频 | 韩日精品在线 | 久久毛片网 | 网站在线观看你们懂的 | 免费av在 | 91九色在线观看视频 | 日韩二三区 | 久久国产精品一区二区 | 亚洲日本va午夜在线影院 | 亚洲五月六月 | 国产一区二区不卡视频 | 日韩精品一区电影 | 最新国产精品亚洲 | 欧美婷婷综合 | 国产精品一级在线 | 一区二区高清在线 | 日韩精品一区二区三区高清免费 | 在线播放 日韩专区 | 91久久精品一区二区二区 | 欧美日韩国产高清视频 | 99在线精品视频观看 | 欧美国产日韩一区二区三区 | 天天做天天爱天天爽综合网 | 亚洲久久视频 | 伊人狠狠干 | 青青网视频 | 久久理论电影 | 久久国产精品免费 | 久久影视精品 | 欧美一区二区三区特黄 | 在线观看黄网站 | 日韩v欧美v日本v亚洲v国产v | 麻豆影视在线播放 | 日本老少交 | 狠狠色婷婷丁香六月 | 中文字幕影片免费在线观看 | 国产综合精品一区二区三区 | 成人理论在线观看 | 蜜臀一区二区三区精品免费视频 | 黄色亚洲在线 | 国产午夜三级一区二区三 | 亚洲精品动漫在线 | 91视频免费看片 | 欧美成人xxx | 在线观看视频日韩 | 国产乱老熟视频网88av | www.久久婷婷 | 91在线www | 日韩精品一区不卡 | 超碰在线国产 | 91亚洲网 | 久久久免费看 | 在线免费观看视频 | 亚洲女同videos | 久久久久久久久久久久国产精品 | 日本三级久久久 | 久久精品久久精品久久精品 | 亚洲污视频 | 免费看黄在线看 | 玖玖色在线观看 | 日本中文字幕网 | 黄色av网站在线免费观看 | 五月天丁香亚洲 | 美女搞黄国产视频网站 | 91麻豆精品久久久久久 | 在线播放 一区 | 精品在线视频观看 | 国产男女免费完整视频 | 国产在线视频在线观看 | 久久综合狠狠综合久久激情 | 久久国产成人午夜av影院宅 | 国产成人一区二区三区在线观看 | 免费亚洲成人 | 欧美最新大片在线看 | 人人爱人人添 | 五月天六月婷 | 国产日韩视频在线播放 | 又黄又爽的视频在线观看网站 | 天天天天天天天操 | 激情视频二区 | 99热在线精品观看 | 日韩精品在线免费观看 | 国产999在线 | 国产中文字幕视频在线 | 在线看片成人 | 亚洲成人家庭影院 | 久久免费看av| 一 级 黄 色 片免费看的 | 日韩资源在线 | 综合久久婷婷 | 97天堂网 | 日韩大片在线观看 | 日韩久久精品一区二区 | 天天草天天干天天 | 亚洲高清视频在线 | 黄色免费视频在线观看 | 久在线观看 | 99r在线播放 | 青青射 | 99视频久久| 国产不卡av在线播放 | av免费电影在线观看 | 日韩理论在线观看 | 欧美成人精品欧美一级乱 | 99精品视频在线免费观看 | 五月婷婷狠狠 | 91网站免费观看 | 免费在线观看成年人视频 | 久久8精品 | 婷婷伊人五月天 | 婷婷色综合 | 超碰人人舔 | 久久久久久久久久电影 | 亚洲国产精品久久久 | 九色自拍视频 | 亚洲精品视频一二三 | 亚洲国产成人精品久久 | 偷拍精品一区二区三区 | 欧美视频www | 久久公开免费视频 | 国产破处在线播放 | 亚洲国产精品小视频 | 亚洲激情校园春色 | 中文理论片 | 91日韩精品视频 | 欧美另类人妖 | 成人黄色片免费看 | 一区二区视频在线播放 | 中文字幕在线观看第三页 | 精品国产乱码久久 | 免费三级黄 | 免费观看高清 | 欧美 日韩 性 | 中文字幕在线观看完整 | 少妇搡bbbb搡bbb搡aa | 狠狠狠狠狠狠干 | 99麻豆久久久国产精品免费 | 福利视频入口 | 亚洲狠狠婷婷综合久久久 | 中文字幕av在线 | 久久激情日本aⅴ | 国产色在线,com | 久久这里只有精品久久 | 就要干b| 97综合网 | 成人精品电影 | 久久久免费 | 91在线看片| 91视频在线自拍 | 成年人免费看的视频 | 国产精品18久久久久久不卡孕妇 | 91精品日韩 | 成人免费观看网站 | 午夜av大片 | 亚洲精品视频在线免费播放 | 国产精品成人在线 | 久久超级碰| 探花视频在线观看+在线播放 | 国产中文字幕在线 | 精品在线看 | 国产高清不卡av | 蜜臀久久99精品久久久无需会员 | 国产精品6999成人免费视频 | 精品欧美一区二区在线观看 | 久热av| 国产精品一区专区欧美日韩 | 国产日韩欧美在线观看视频 | 午夜精品久久久久久久久久久久 | av免费电影在线观看 | 日日爽视频 | 成年人免费在线观看 | 日韩精品一区电影 | 国产成人精品在线观看 | av色图天堂网| 国产成人精品一区二区在线观看 | 国产99中文字幕 | 国产在线观看你懂得 | 在线只有精品 | 亚洲丝袜中文 | 日本黄色黄网站 | 少妇bbw搡bbbb搡bbb | sm免费xx网站 | 免费看一级特黄a大片 | 干狠狠 | 欧美激情精品久久久 | 美女视频久久久 | 久久免费视频8 | 免费人人干 | 888av| 午夜精品久久久久久久99水蜜桃 | 97超碰人 | 国产精品自拍在线 | 亚洲成人第一区 | 久久超碰在线 | 91av小视频| 国产在线视频资源 | 国产精品手机在线播放 | 一区二区三区 亚洲 | 国产第一页在线观看 | 国产热re99久久6国产精品 | www.神马久久 | 黄色影院在线播放 | 精品国产精品久久一区免费式 | 亚洲第一中文字幕 | 中文在线免费看视频 | 精品二区视频 | 日韩欧美视频在线播放 | 免费观看久久久 | 久久人人爽 | 国产成人精品午夜在线播放 | 精品国产区 | aa一级片 | 九九国产精品视频 | 欧美日韩视频在线 | 99r在线观看 | 日韩免费视频 | 色综合色综合久久综合频道88 | 一区二区不卡在线观看 | 欧美精品久久 | 久久久久久久久毛片精品 | 久草在线视频网 | 在线观看国产 | 中文字幕中文字幕在线中文字幕三区 | 国产精品av免费在线观看 | 国产日韩精品一区二区 | 在线观看视频一区二区三区 | 久草国产视频 | 久久精品一二三区白丝高潮 | 国内精品久久久久久久久 | 欧美a免费 | av丝袜在线 | 三级在线国产 | 91成人精品一区在线播放69 | 天天色天天射天天干 | 91视频高清| 97电影手机版 | 99视频在线观看免费 | 丁香电影小说免费视频观看 | 国产精品久久久久久久久久新婚 | 中文字幕二区在线观看 | 字幕网在线观看 | 国产精品久久久久9999吃药 | 日韩在线国产 | 丁香午夜婷婷 | 精品在线观看免费 | 国产v在线播放 | 久久久久久久久久久久久国产精品 | 色视频在线免费观看 | 69国产盗摄一区二区三区五区 | 亚洲精品午夜久久久久久久久久久 | 国产97色 | 激情动态 | 久久国产综合视频 | 久久精品一二三 | 国产精品 久久 | 亚洲精品456在线播放第一页 | 成人作爱视频 | 日韩最新在线 | 国产99久久久国产精品免费二区 | 久久久久亚洲a | 国产精品第 | 日韩综合一区二区 | 少妇bbbb揉bbbb日本 | 精品视频9999 | 91精品国产自产在线观看永久 | 国产一级二级三级视频 | 国产精品wwwwww| 久久久久综合视频 | 狠狠色狠狠色综合系列 | 天天爽天天爽夜夜爽 | 成人国产网站 | 国产精品国产亚洲精品看不卡15 | 在线观看网站av | 91网址在线看 | 美女国产免费 | 久久精品精品 | 久久精品视频在线观看免费 | 激情婷婷久久 | 一级片视频免费观看 | 中文字幕在线播放av | 亚洲精品在线观看网站 | 丁五月婷婷 | 伊人网站| 成年人电影免费在线观看 | 亚洲精品美女视频 | 一区二区三区动漫 | 免费成人av网站 | 天堂激情网 | 中文字幕在线国产 | 亚洲少妇xxxx| 国产成人精品一区二区三区在线观看 | 91激情视频在线观看 | 日本精品中文字幕在线观看 | 97超级碰碰碰视频在线观看 | 日韩在线免费高清视频 | 亚洲免费婷婷 | 色婷婷福利视频 | 看av免费网站 | 欧美日韩观看 | 黄色91在线观看 | a黄色一级片 | 欧美孕交vivoestv另类 | 狠狠狠色丁香综合久久天下网 | 黄色免费网 | 日韩在线视频网站 | www.在线观看视频 | 亚洲综合日韩在线 | 成人免费看片网址 | 国产1区在线 | 综合色在线观看 | a级片网站 | 国产黄色免费观看 | 精品在线观看一区二区三区 | 天天射天天操天天色 | 亚洲视频免费 | 黄色av免费电影 | 久草视频免费在线观看 | 久久久午夜视频 | 精品国产乱子伦一区二区 | 国内精品久久久久久中文字幕 | 九色精品免费永久在线 | 精品亚洲在线 | 黄色特级片 | 亚洲毛片久久 | 日韩a在线观看 | av先锋影音少妇 | 久久久久久久免费看 | 久久优| 主播av在线 | 黄色免费观看网址 | 国内精品久久久久久久影视简单 | 四虎国产| 久久国内精品视频 | 一区二区三区四区五区在线 | 五月天婷婷在线视频 | 丁香国产视频 | 日韩精品2区 | 日本精品久久 | 久久午夜精品影院一区 | 日韩一区精品 | 一区免费在线 | www.天天射 | 人人干,人人爽 | 天天射天天舔天天干 | 国产一级黄| 免费又黄又爽的视频 | 国产精品中文字幕av | 97电影网站| 黄色av大片 | 国色天香在线观看 | 探花视频免费观看高清视频 | 在线观看国产日韩欧美 | 91精品久久香蕉国产线看观看 | 欧美资源 | 日韩二区三区在线 | 色综合天天爱 | 久久1区| 亚洲国产午夜精品 | 日日操日日操 | 91九色视频国产 | 黄网站色视频免费观看 | 国产视频美女 | 97av在线视频免费播放 | 色婷婷亚洲精品 | 国产91精品一区二区 | 午夜精品视频一区 | 久久高清av | 国产99久久精品一区二区永久免费 | 欧美久久久久久久久 | 国产精品18久久久久久久 | 久久久久久久久网站 | 午夜久久电影网 | 在线观看视频免费播放 | 精品福利网 | 在线观看国产日韩欧美 | 久草a视频| 久久精品网站视频 | 91一区二区三区久久久久国产乱 | 日韩视频三区 | 免费的成人av | 久久国内精品视频 | 久久久91精品国产一区二区三区 | 免费一级片在线 | 婷婷色婷婷 | 日韩免费视频播放 | 国产精品网站一区二区三区 | 怡春院av| 精品在线视频播放 | 青青草国产成人99久久 | 午夜男人影院 | 69国产盗摄一区二区三区五区 | 国产精品一区在线观看 | 免费www视频 | 超碰日韩 | 欧美日韩电影在线播放 | 美女啪啪图片 | 日韩欧美在线观看 | 91欧美精品 | 91丨九色丨国产在线观看 | 一区二区三区在线观看免费视频 | 四虎永久精品在线 | av在线免费观看黄 |