WebRtc+WebSocket做直播

WebRTC是现在新兴的一种视频技术,利用浏览器,所以对浏览器的版本有要求,想学视频的小伙伴可以 观关注一下这个技术,现在这个技术在国外已经相对成熟;在国内的发展也已经逐渐跟上;

编译器Idea,

直接上代码,

首先主播的前端页面代码:

<%--
  Created by IntelliJ IDEA.
  User: Taoyongpan
  Date: 2017/10/12
  Time: 22:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>最强主播</title>
</head>
<body>
<!-- 如何使用浏览器调用设备的摄像头并且能够获取到他的数据展示出来 -->
<video src="" id="vi" autoplay style="width:640px;height:480px;"></video>
<!-- webrtc -->
<canvas id="output" style="display:none"></canvas>
<script type="text/javascript">
    var back = document.getElementById("output");
    var backContext = document.getElementById("output").getContext("2d");
    var video = document.getElementById("vi");
    var socket ;
    var interval;
    setTimeout("init()",100);
    function init(){
        //这个需要浏览器支持 建立websocket的服务
        socket = new WebSocket("ws://127.0.0.1:8080/onlineServer");
        socket.onopen=onOpen;
        socket.onclose = onClose;
    }
    function onOpen(){
        //定时传输数据到服务器
        clearInterval(interval);
        interval = setInterval(function(){draw()},50);
    }
    function onClose(){
        init();
    }
    function draw(){

        backContext.drawImage(video,0,0,back.width,back.height);
        //将视频的图像 50%的像素发送出去
        socket.send(back.toDataURL("image/jpeg",0.2));

    }
    var success = function(stream){
        document.getElementById("vi").src = window.URL.createObjectURL(stream);
    }
    //js bom模型
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
    //
    navigator.getUserMedia({video:true,audio:false},success,console.log);
</script>
</body>
</html>

 观众的前端页面,代码如下:

<%--
  Created by IntelliJ IDEA.
  User: Taoyongpan
  Date: 2017/10/13
  Time: 17:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主播房间</title>
</head>
<body>
<img id="recive" style="width:400px;height:330px;">
<div id="dm" style="width:400px;height:330px;position:absolute;background:rgba(0,0,0,0.3);color:white;top:0px;left:0px;overflow:auto;"></div>
<input type="text" id="msg">
<button onclick="sendMsg()">发送消息</button>
<script type="text/javascript">
    var recive_socket = new WebSocket("ws://127.0.0.1:8080/onlineServer");
    var image = document.getElementById("recive");
    recive_socket.onmessage = function(info){
        image.src = info.data;
    }
    function $(id){
        return document.getElementById(id);
    }
    var msg_socket = new WebSocket("ws://127.0.0.1:8080/chat");
    msg_socket.onmessage = function(data){
        document.getElementById("dm").innerHTML+="&nbsp;"+data.data;
    }
    function sendMsg(){
        var msg = document.getElementById("msg").value;
        msg_socket.send(msg);
    }
</script>
</body>
</html>

 直播的 servlet对应的代码:

package web;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Vector;

/**
 * Created by Taoyongpan on 2017/10/13.
 */
//指定一个URI客户端可以通过这个URI来连接到我们的webSocket 类似servletmapping
@ServerEndpoint("/onlineServer")
public class VideoServlet {
    //当一个客户端访问onlineServer连接的时候,创建一个OnlineServer的实例
    private Session session;//当前的会话对象 通过session 服务器可以向客户端主动发送消息

    //建立一个静态的集合来存储所有客户端的实例
    public static Vector<VideoServlet> clients = new Vector<VideoServlet>();
    /**
     *
     * @Title: onOpen
     * @Description: 当客户端与服务器建立连接的时候触发方法
     * @param session    设定文件
     * @return void    返回类型
     * @throws
     */
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        clients.add(this);//将当前客户端加入客户端列表
        System.out.println("新连接连接!!");
    }
    @OnClose
    public void onClose(){
        clients.remove(this);
        System.out.println("有一个连接!!");
    }
    //当客户端向服务器发送消息的时候触发的事件
    @OnMessage
    public void onMessage(String message,Session session){
        //群发消息 广播消息
        for(VideoServlet client : clients){
            try {
                //这是往客户端发送消息
                client.session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                //e.printStackTrace();
            }
        }
    }

}

 观众端弹幕对应的servlet代码:

package web;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Vector;

/**
 * Created by Taoyongpan on 2017/10/13.
 */
@ServerEndpoint("/chat")
public class ChatServlet {
    //当一个客户端访问onlineServer连接的时候,创建一个OnlineServer的实例
    private Session session;//当前的会话对象 通过session 服务器可以向客户端主动发送消息
    //建立一个静态的集合来存储所有客户端的实例
    public static Vector<ChatServlet> clients = new Vector<ChatServlet>();
    /**
     *
     * @Title: onOpen
     * @Description: 当客户端与服务器建立连接的时候触发方法
     * @param session    设定文件
     * @return void    返回类型
     * @throws
     */
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        clients.add(this);//将当前客户端加入客户端列表
        System.out.println("新连接连接!!");
    }
    @OnClose
    public void onClose(){
        clients.remove(this);
        System.out.println("有一个连接!!");
    }
    //当客户端向服务器发送消息的时候触发的事件
    @OnMessage
    public void onMessage(String message,Session session){
        //群发消息 广播消息
        for(ChatServlet client : clients){
            try {
                //这是往客户端发送消息
                client.session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                //e.printStackTrace();
            }
        }
    }
}

猜你喜欢

转载自taoyongpan.iteye.com/blog/2396244