深入理解WebSocket,让你入门音视频

这篇具有很好参考价值的文章主要介绍了深入理解WebSocket,让你入门音视频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

原文在这里https://testerhome.com/topics/34427

WebSocket浅析

一、 WebSocket概念

WebSocket是一种在单个TCP连接上进行全双工通信的网络协议。意为:经过一次TCP握手就可以直接创建持久性连接,进而可实现服务端和客户端双向数据传输。websocket的协议标识是ws和wss

websocket的应用场景:

  • 在线聊天
  • 协作文档编辑
  • 大型多人在线游戏
  • 股票交易应用
  • webrtc

二、为什么需要WebSocket协议

2.1 WebSocket的出现主要是为了弥补HTTP半双工通信的缺陷。

在websocket没有出现之前,为了让http能够实现即时通信,前辈们也做了一些研究,常用的有三种方法:

  1. HTTP轮询

    HTTP轮询(polling):在固定的时间间隔,由浏览器向服务器发起http请求,无论服务器中的数据有没有更新,都会给客户端作出响应。

    但如果知道信息交付的精确间隔,那么轮询也是一个好的方案,但对于一些实时的数据是不能预测的,所有就会导致发出一些不必要的请求。

  2. 长轮询

    长轮询( long polling):客户端向服务端请求信息,并在设定的时间段内打开一个连接。服务器如果没有任何信息,会保持请求打开,直到有客户端可用的信息,或者直到指定的超时时间用完为止。

    长轮询中客户端必须频繁地重连到服务器以读取服务端的信息,会增大服务端到压力。

  3. 流化技术

    客户端向服务端发起一个长连接请求,服务端收到请求后响应它并不断更新连接状态,以确保连接在客户端与服务端之间一直有效。服务端可以通过这个连接将数据主动推送到客户端。

    但存在一个问题:每当服务器有需要交付给客户端的信息时,它就会更新响应,但是服务器从不发出完成http响应,从而导致连接一直打开,在这种情况下,代理和防火墙可能会缓存一个响应,就会导致信息交付的延迟增加。

以上三种方法都实现了近乎实时的通信,但都涉及HTTP请求和响应,当然也包含了许多附加和不必要的延迟,此外,在每一种情况下,客户端必须主动给服务器发送消息,且客户端都必须等待请求返回,才能发出后续的请求,再一次增加了延迟。

2.2 websocket与http有着良好的兼容性

默认端口是80和443, 并且握手阶段采用HTTP协议,因此握手的时候不容易屏蔽,能通过各种的HTTP代理。

三、WebSocket通信原理

以七牛webrtc demo为例:https://demo-rtc.qnsdk.com/

深入理解WebSocket,让你入门音视频,音视频,websocket,音视频,心跳算法,webRTC,原力计划

详解:

每个WebSocket连接都开始于一个http请求,这个请求和其他请求类似,但是websocket连接请求中包含一个特殊的首标,Upgrade:websocket,意为:客户端想将HTTP协议升级为websocket协议。如果服务端同意,则响应Connection:Upgrade,同时 101 Switching Protocols 也表示协议切换成功,这个过程叫做初始握手

但为了成功地完成握手,websocket服务器必须根据客户端请求消息中的Sec-WebSocket-Key,响应SHA-1的信息摘要,即:Sec-WebSocket-Accept 。其中:Sec-WebSocket-Key是一个随机字符串,服务端接收到Key之后,会对其进行加密,并进行base-64编码,然后将结果响应给客户端;客户端将Key使用同样的加密算法进行加密并进行base-64编码,当得到的值与服务端响应的值保持一致时,表示真正的握手成功。

至此,HTTP已经完成了它所有的工作,接下来就是完全按照Websocket协议进行通信。

四、WebRTC中websocket的使用

在webrtc中websocket充当信令服务器,那何为信令服务器?信令可理解为信息的传递或者命令的执行,主要是传输用户的一些信息。在webrtc中如果没有信令服务器,webrtc之间是不能够通信的。

深入理解WebSocket,让你入门音视频,音视频,websocket,音视频,心跳算法,webRTC,原力计划

蓝色区域表示发送端(Caller)和接收端(Callee),如果两者想要传递媒体数据,那么有两个信息必须经过信令服务器交换;

1)媒体信息:通过SDP协议进行交换,SDP是一个描述多媒体连接内容的协议,其中包含了分辨率、编解码方式、格式、是否支持音频、视频等。例如,Caller想给Callee发一个H264的视频,需要先问一下Callee能不能解H264的视频,如果可以解码,则可以通信;如果Callee只能解H265的视频,则不可通信。

2)网络信息:通常指的是ip地址、端口、以及数据存放地址,我们称之为ICE,这是一个基于offer/answer模式解决NAT穿越的协议集合。在ICE中主要包含STUN+TURN主要协议。当Callee想要接收数据时,需要将所有的网络相关的信息传到信令服务器,信令服务器再转发给Caller,Caller拿到信息之后,发现处于同一个局域网,则可通信,如果不在同一个局域网,则通过TURN协议进行NAT穿越,再利用Relay转发,两者即可通信。

因为TCP的超时时间为60s,如果要保持长连接的话,最好加一个ping/pong的心跳检测,就是服务端给客户端发一个ping的消息(绿色),客户端再给服务端发送一个pong的消息(红色),就是在server端加一个定时调用函数setInterval,即可实现

setInterval(() => {
        connect.send('ping');
    }, 3000);

深入理解WebSocket,让你入门音视频,音视频,websocket,音视频,心跳算法,webRTC,原力计划

五、使用 node.js 实现简易聊天室

第一步:实现服务器

安装第三方依赖库:nodejs-websocket

具体实现如下

const ws = require('nodejs-websocket')
const PORT = 3003
const TYPE_ENTER = 0
const TYPE_LEAVE = 1
const TYPE_MSG = 2

//1. 记录当前连接上来的总的用户数量
let count = 0
//2.conn每个连接到服务器的用户,都会有一个conn
const server = ws.createServer(conn => {
    console.log('有用户进来')
    count++
    conn.userName = `用户${count}`
   
    broadcast({
        type:TYPE_ENTER,
        msg:`${conn.userName}进入了聊天室`,
        time:new Date().toLocaleTimeString()
    })

    //每当接收到用户传递过来的数据,这个text事件会被触发
    conn.on('text',data =>{
        console.log('接受到用户的数据',data)  
        broadcast({
            type:TYPE_MSG,
            msg:data,
            time:new Date().toLocaleTimeString()
        })
    })
  
    conn.on('close',() => {
        console.log('连接断开了')
        count--
        broadcast({
            type:TYPE_LEAVE,
            msg:`${conn.userName}离开了聊天室`,
            time:new Date().toLocaleTimeString()
        })

    })
    conn.on('error',() => {
        console.log('用户连接异常')
    }) 
})

// 通过广播,给所有的用户发送消息
function broadcast(msg){
    //server.connections:表示所有用户
    server.connections.forEach(item => {
        item.send(JSON.stringify(msg))
    })
}
server.listen(PORT,() => {
    console.log('websocket服务启动成功了,监听了端口' + PORT)
})

第二步:实现客户端

<html>
    <head>
        <title>在线聊天室</title>
    </head>
    <body>   
        <input type="text" placeholder="输入内容">
        <button>发送请求</button>
        <!--接收消息-->
        <div></div>
        <script>     
            var input = document.querySelector('input');
            var button = document.querySelector('button');
            var div = document.querySelector('div');
            const TYPE_ENTER = 0
            const TYPE_LEAVE = 1
            const TYPE_MSG = 2
             //创建websocket对象
            var socket = new WebSocket('ws://localhost:3003');
            socket.addEventListener('open',function(){
                div.innerHTML = '连接服务器成功'

            })
            //主动给websocket服务发送消息
            button.addEventListener('click',function(){
                var value = input.value
                socket.send(value)
                input.value = ''
            })
            socket.addEventListener('message',function(e){
                var data = JSON.parse(e.data)
                var dv = document.createElement('div')
                dv.innerText = data.msg +'------'+data.time
                if(data.typy === TYPE_ENTER){
                    dv.style.color = 'green'
                }else if(data.typy === TYPE_LEAVE){
                    dv.style.color = 'red'
                }else{
                    dv.style.color = 'blue'
                }
                div.appendChild(dv)
            })
            socket.addEventListener('close',function(){
                div.innerHTML = '服务断开链接'
            })
        </script>

    </body>
</html>

demo展示:

深入理解WebSocket,让你入门音视频,音视频,websocket,音视频,心跳算法,webRTC,原力计划文章来源地址https://www.toymoban.com/news/detail-578287.html

到了这里,关于深入理解WebSocket,让你入门音视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 5G时代下,Android音视频强势崛起,我们该如何快速入门音视频技术?

    作为Android开发者的我们到底应不应该上音视频这条船? 接下来一起分析下。 大趋势 从未来的大趋势来看,随着5G时代的到来,音视频慢慢变成人们日常生活中的必需品。除了在线教育、音视频会议、即时通讯这些必须使用音视频技术的产品外,其它的产品也需要加入音频、

    2024年04月15日
    浏览(50)
  • springboot+websocket+webrtc 仿微信、仿QQ 音视频通话聊天 飞鱼chat IM即时通讯

    仿微信、QQ音视频聊天,文字表情、收发文件图片等功能。本项目使用springboot+websocket+webrtc-bootstrap5+H5+JQuery3.3+mysql实现,可自适应PC端和移动端 git地址在最后 pc端效果图 WebSocket是一种在单个TCP连接上进行全双工通信的协议,这使得客户端和服务器之间的数据交换变得更加简单

    2024年02月04日
    浏览(41)
  • 音视频入门知识学习

    1920x1080的屏幕,32位,30帧的fps。一秒钟需要1920x1080x32x30字节,所以需要压缩 压缩的核心思想就是去除冗余信息 空间冗余 空间冗余 == 相邻像素重复:图像内部相邻像素之间存在较强的相关性多造成的冗余 比如一张图片中间的一个位置大小20x20,它的表现肉眼看起来其实是一

    2024年02月12日
    浏览(34)
  • 音视频入门基础理论知识

    本节介绍了音视频的基本原理知识以及编码相关概念。 视频(Video) 泛指将一系列静态影像以电信号的方式加以捕捉、 纪录、 处理、 储存、 传送与重现的各种技术。 连续的图像变化 每秒超过 24 帧(frame,fps) 画面以上时, 根据 视觉暂留原理 , 人眼无法辨别单幅的静态画

    2024年02月09日
    浏览(32)
  • webrtc入门:4.RTCPeerConnection连接音视频流

    有了前面的准备,离视频会议的建设又进了一层了。我们现在准备好了音视频流的数据。双方的视频数据需要交给对方,对方就能看到相关的数据,达到了视频会议的效果。 假设我们是一个视频会议的发起人,我们当然先要知道,我们想跟谁进行视频通话,对方需要把相关的

    2023年04月10日
    浏览(27)
  • FFmpeg入门详解之19:音视频封装原理简介

    什么是数据封装和解封装? 数据封装(baiData Encapsulation) ,笼统地讲,就是把业务数据映射到du某个封装协议zhi的净dao荷中,然后填充对应协议的包头,形成封装协议的数据包,并完成速率适配。 解封装 ,就是封装的逆过程,拆解协议包,处理包头中的信息,取出净荷中的业

    2023年04月09日
    浏览(35)
  • Android 音视频入门 (四)- 记录一次MediaCodec ,天呐

    isEncoding = true //开始编码 mMediaCodec.start() //构建连接器。 mWorkerThread = HandlerThread(“WorkerThread-Encoder”) mWorkerThread.start() mHandler = Handler(mWorkerThread.looper) } 注意,我们并不在此处就开启Muxer,我们会在子线程中接受数据的时候的某个状态开始进行混合。 mCameraDevice.setPreviewCallback {

    2024年04月16日
    浏览(31)
  • 深入探究音视频开源库 WebRTC 中 NetEQ 音频抗网络延时与抗丢包的实现机制

    记录日常工作中遇到的音视频问题,以供大家借鉴或参考!

    2024年02月08日
    浏览(56)
  • 深入探究音视频开源库WebRTC中NetEQ音频抗网络延时与抗丢包的实现机制

    目录 1、引言 2、WebRTC简介 3、什么是NetEQ? 4、NetEQ技术详解 4.1、NetEQ概述 4.2、抖动消除技术 4.3、丢包补偿技术 4.4、NetEQ概要设计 4.5、NetEQ的命令机制 4.6、NetEQ的播放机制 4.7、MCU的控制机制 4.8、DSP的算法处理 4.9、DSP算法的模拟测试 5、NetEQ源文件说明 6、参考文档 C++软件异常

    2024年04月25日
    浏览(38)
  • FFmpeg 命令:从入门到精通 | ffppeg 命令提取音视频数据

    本节主要介绍了一些使用 ffmpeg 命令提取、分离音视频数据的方法。 保留编码格式: 强制格式: 保留编码格式: 强制格式:

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包