在线直播间和视频追帧【转载】

最新推荐文章于 2024-07-26 09:30:38 发布
OceanZ~ 最新推荐文章于 2024-07-26 09:30:38 发布
阅读量1.8k 收藏 4
点赞数
分类专栏: Video 文章标签: javascript 网络
原文链接:https://www.polyv.net/news/2019/05/cp0191/
版权
Video 专栏收录该内容
2 篇文章
订阅专栏

背景

当下视频直播如此红火,打造一个在线直播间涉及到哪些技术呢?

视频直播由主播的直播端以及观众的观看端组成。一个简单的观看端最起码应包含播放器以及聊天室。下面就围绕这两大模块来讲述相关技术。

视频直播,可以分为视频采集、前处理、编码和封装、传输、解封装和解码、播放这几个环节。

直播端通过硬件设备采集音视频数据,经过前处理以及编码、封装后,还要传输到观看端。这一步一般交由CDN接力完成。推流端会把视频流推到源站,CDN从源站拉流,拉流成功后编码封装成不同的格式提供各观看端播放。简单示意图如下:

615

(网络引用图片)

接下来讲一下观看端的基本要求:

多终端观看

观看稳定、不卡顿

延迟低、高并发


多终端观看

首先明确需要支持的终端,有移动端APP(iOS、Android)、移动端浏览器、小程序、PC浏览器、PC 客户端。对于PC浏览器,一般支持到IE8。并且,由于Chrome浏览器默认屏蔽Flash,所以在PC浏览器中采用的策略为:优先在兼容H5的浏览器使用H5播放,否则降级使用Flash播放。两者支持的直播播放视频格式差异如下:

Flash支持rtmp或 http-flv 直播播放。延时~3秒。

H5支持M3u8直播播放。延时~15秒。

观看稳定、不卡顿

造成视频直播卡顿的原因可能是多方面的,涉及到直播端、网络、观看端。

直播端

主要问题有硬件配置太低、推流参数配置问题、音视频时间戳不同步。可以通过以下措施解决:

升级硬件、软件设置,提高兼容性和容错率 ( 这部分是硬装,必须有好的装备才能有好的推流质量啊 )。

使用硬编硬解方案,充分利用GPU加速。

降低视频码率,选择流畅、标清画质或者使用动态码率推流。

网络

主要问题有网络抖动、拉流服务器与观看端链路过长,可以通过以下措施解决:

选用稳定的运营商网络并合理布局CDN节点。

使用充足的网络带宽。

观看端

在网络上观看视频,缓冲区就是在你看视频时提前储存部分视频数据,当数据到达一定的量后再播放画面,使得播放更流畅。若设置得过小,在网络不稳定时就无法流畅地连续播放;若设置过大则会累积时延。所以要设置一个适中的缓冲区。

// Flash
netStream.bufferTime = 1 // 单位:秒
// FLV.js
flvjs.createPlayer({
  type: 'flv',
  isLive: true,
  url: 'video.flv'
},{
  stashInitialSize: 120 // 默认:384KB
})

延时低、高并发

我们知道,视频其实是由一帧一帧的图像构成的,RTMP基于TCP不会丢包,所以当网络状态差时,服务器会将包缓存起来。等网络状况好了,就一起发给观看端,导致观看端累积太多视频帧数据,延时随时间增长而增加。对于这个问题,除了上文提及的设置适当的缓冲区长度外,还可以增加追帧和丢帧操作实现播放追赶。

Flash代码:

// Flash实现追帧:定时器轮询检测当前缓冲区长度大于30秒时重连,重新拉取直播流
netStream.bufferTimeMax = 0.1 // 设置bufferTimeMax主动追帧

if(netStream.bufferLength > 30) { 
  // 缓冲区长度大于30,重新连接  
  reconnectStream() 
}

videojs修改bufferTime=0.01
链接:https://pan.baidu.com/s/1_-xB7O1O36pEkEEW9024zA
密码:3r6u

H5代码:

// H5实现追帧,判断当前缓冲区结束时间与当前时间相差超过5秒,则追帧
if (video.buffered.length > 0 && video.buffered.end(0) - video.currentTime > 5) {
  // 直播流时间接近缓冲时间的话画面容易卡死,所以保险起见-1秒  
  video.currentTime = video.buffered.end(0) - 1;
}

另外,如果用到FLV.js播放视频,可以开启它的Worker特性,多进程解析优化延迟 ,并减少buffer。

// FLV.js
flvjs.createPlayer({
  type: 'flv',
  isLive: true,
  url: 'video.flv'
},{
  enableWorker: true,
  enableStashBuffer: false,
  stashInitialSize: 120 // 默认:384KB
})

聊天室

即时聊天IM服务既要保证实时性,可靠性,又要抗住高并发。在实现过程中我们使用以下方法解决。

1、传输模式优先选择 WebSocket,若不支持则降级为轮询。

const io = require('socket.io')({ "transports":['websocket', 'polling']})

2、Node.js 服务器因消息并发大导致性能低下。

通过以下方案极大的优化了聊天室的稳定性和可靠性。

(1)使用命名空间的功能

命名空间的作用就是把消息限定在一定范围内传播。对于一些不需要全局接收的消息就加上命名空间,可以极大的节约资源的传输。

// 创建命名空间
const io = require('socket.io')()
const adminNamespace = io.of('/admin')

adminNamespace.to('level1').emit('an event', { some: 'data' })

(2)聊天消息队列

观众进入聊天室房间会广播登录消息,比如房间内同时有2W人,每个人登录要对房间内所有人广播"我"登录了,相当于发送了2W条消息。若并发量大,对服务器性能要求极高。使用聊天队列消息分批显示可以防止同时处理大量消息,提高处理性能。

// 消息队列
let scoektMsgArr = [{
   EVENT: 'SPEAK',
   uid: socketId,
   content: '这是第一条聊天消息' 
},...]
let minCount = 0

setInterval(()=>{
    const maxCount = minCount + 100
    const newScoektMsgArr = scoektMsgArr.slice(minCount, maxCount)
    newScoektMsgArr.forEach((item) => {
       socket.emit('message', JSON.stringify(item))
    })
}, 1000)

(3)服务器弹性伸缩

祭出最后的大招,能优化的已经极力优化了,那剩下的事情就是配置服务器弹(jia)性(fu)伸(wu)缩(qi)。

3、掉线重连机制。

掉线会触发disconcent 事件,监听它再创建socket连接即可。心跳检查即定时发送一次消息,保持连接状态。

// 保持心跳
setInterval(()=>{
    socket.emit('message', JSON.stringify({
      EVENT: 'HEARTBEAT',
      uid: socketId
    }))
}, 30 * 60 * 1000)

// 断开重连
socket.on('disconnect', () => {
    this.connect()
})

connect() {
  socket.on('connect', () => {
     //TODO
  })
}
确定要放弃本次机会?
福利倒计时
: :

立减 ¥

普通VIP年卡可用
立即使用
OceanZ~
关注 关注
  • 0
    点赞
  • 踩
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  • 分享
    复制链接
    分享到 QQ
    分享到新浪微博
    扫一扫
  • 举报
    举报
专栏目录
MOBA追帧算法:排队买奶茶的科技奇遇
欢迎来到《技术探索》,这是一个专注于游戏开发技术的博客。在这里,我们将深入探讨游戏引擎、图形渲染、人工智能、物理模拟等领域的最新技术和最佳实践。无论您是初学者还是经验丰富的开发者,我们都希望为您提供有价值的见解和实用的技巧。
08-05 121
MOBA游戏的追帧算法就像你排队掉队后小跑追上朋友,算法让你的游戏进度飞快补齐,和其他玩家保持同步,保证了公平和流畅。我们继续用生动形象的方式,深入讲讲MOBA游戏追帧算法的具体实现步骤,以及追帧时如何避免卡顿和掉帧。追帧算法让你在网络卡顿后,像开“快进”一样追上游戏进度。通过分批处理、只渲染关键帧、动态调整速度等方法,避免了卡顿和掉帧,保证了游戏体验的流畅和公平。
播放器追帧方案
LZ0422的博客
01-03 1622
总结: 本文针对教育直播类型追帧设计的方案,需要根据不同的直播类型进行选择,具体方案如下: ** 优先推荐:方案二【具体方式3】,原因:给用户更好的体验效果,不会让用户在上课过程中,错过最精彩的时刻;【如有对应条件,也可以选择方案四&方案五】 ** ** 不推荐:方案一&方案三,原因:在网络不稳定情况下,会发生声调变声情况(注意:根据不同设备音频渲染效果不同,导致体验感较差); ** 方案一:音频缓慢追上,视频直接丢掉; 方案二:音视频文件都同时丢掉(可设置丢掉的方式); 1.播放
参与评论 您还未登录,请先 登录 后发表或查看评论
PLDroidPlayer 是 Pili 直播 SDK 的安卓播放器。支持所有直播常用的格式,如:RTMP、HLS、FLV。拥有优秀的功能和特性,如:首屏秒开、追帧优化、丰富的数据和状态回调、硬解软解
王项雨 的博客
01-09 4066
PLDroidPlayer 是 Pili 直播 SDK 的安卓播放器。支持所有直播常用的格式,如:RTMP、HLS、FLV。拥有优秀的功能和特性,如:首屏秒开、追帧优化、丰富的数据和状态回调、硬解软解支持。而且可以根据自己的业务进行高度定制化开发。 https://github.com/pili-engineering/PLDroidPlayer
视频直播关键技术:流畅、拥塞和延时追赶
weixin_34177064的博客
08-07 312
这两年互联网领域的一个热门关键词就是视频直播,从刚开始的游戏直播和秀场娱乐开始,现在各个行业里都植入了直播元素。网易云信多年以来,一直深耕于音视频领域,这篇文章将和大家聊一聊视频直播的几个关键技术。 相关阅读推荐《如何快速实现移动端短视频功能?》 《视频私有云实战:基于Docker构建点播私有云平台》清晰度 4K、1080p、720p,这些概念被各大电视机厂商炒作了这么多年,已经地球人都...
小飞机工作笔记(二)追帧与快照同步
weixin_34146805的博客
07-23 579
还是先说下追帧的问题吧。飞机项目采用的是帧同步的方案,渲染层与逻辑层分离,由定时器一秒20帧来驱动逻辑层做update,而对于渲染层则是以一秒40帧的速度来驱动。渲染层轮循逻辑层做插值。在网络抖动的情况下,本地演算的帧LocalFrameId可能会落后或领先服务器下发的ServerFrameId。顺便提一句,ServerFrameId在这里主要是为了给各个客户端一个统一的参照系,并不会在F...
直播间自动评论软件直播间自动发言工具直播间自动评论脚本短视频自动回复短视频自动评论直播间自动喊话神器直播间自动评论点赞
最新发布
11-18
直播间自动评论软件直播间自动发言工具直播间自动评论脚本短视频自动回复短视频自动评论直播间自动喊话神器直播间自动评论点赞 抖音直播间自动评论软件直播间自动发言工具直播间自动评论脚本短视频自动回复短视频...
解决抖音短视频和直播间不适宜视频课程-网盘链接提取码下载 .txt
02-07
本套课程深度分析账号不适宜加热原因、如何排查与应对方案,解决成功率达不到100%,只要不是小黑屋账号,解决成功率均高于90%。 视频大小:570MB
一对一视频社交原生交友双端APP系统源码带同城直播间视频聊天系统
08-06
高清视频聊天直播间,按分钟计时付费,可进行美颜设置、送礼打赏、发送消息内容。 一对一语音聊天;按分钟计时付费,主播和用户可以进行一对一语音聊天,支持送礼打赏。 主播详情页介绍;主要分为两部分显示,优先...
Android项目源码基于RTMP和RTC混合引擎的在线视频连麦互动直播
07-29
在本文中,我们将深入探讨基于Android的在线视频连麦互动直播项目,该项目利用了RTMP(Real-Time Messaging Protocol)和RTC(Real-Time Communication)混合引擎。首先,我们需要明确,这个项目是使用Android ...
Vedio.class_soe8b_网易云视频直播apiPHP源码转载_直播接口_
10-04
例如,可能需要使用API来创建一个直播间、获取直播间信息、管理主播权限、处理用户观看直播时的互动等。然后,在Vedio.class.php中实现这些接口的调用逻辑,根据业务需求进行数据处理。 PHP源码的“转载”可能意味...
video.js在线自适应视频播放器.rar_html5 flash_html5 视频_videojs 自适应_在线 自适应 视
07-15
自适应播放flash或html5视频,可以远程识别
video-js rtmp播放 swf文件低延迟自编译文件
06-13
video-js rtmp播放 swf文件低延迟自编译文件, 包括:video-js.swf.0.01 (延迟0.01秒) video-js.swf.0.1(延迟0.1秒) 和原版的video-js.swf.1 (延迟1秒)
video-js.swf
06-12
修改了bufferTimeMax参数(flash的最大缓冲时间) 的值,改为0.5
Android IjkPlayer内核编译记(二)RTMP追帧优化
YangLe
07-26 1319
使用IjkPlayer内核播放RTMP视频流的时候,在网络不好的情况下,延迟会越来越高,因为项目对视频实时性有一定的要求,最近一直在解决这个问题,看了下源码中的Issues,发现很多人也遇到了这个问题,一通参数设置下去效果有点改善但不多,也试过编译别人已经改好的版本,发现效果也不太理想,无它,只能自己动手改改了。先说下为什么会发生延迟的现象,本文只讨论拉流端的优化,当然实际项目应用的时候,推流端也要一起优化下。
video-04-videojs配置及使用
大雾起了清晨
06-29 1万+
(保姆级教程)videojs是一种轻框架,可以帮我们快速开发一个video视频组件
videojs 卡顿_多快好省的解决网页上视频播放兼容性问题
weixin_39959482的博客
12-20 3633
今天我们来介绍一个能够快速、便捷、有品质保障的技术手段来解决网页上视频播放兼容性问题。现在如果一个网站需要在网页上插入视频,第一反应就是用到H5的video标签,H5的出现解决一部分浏览器网页的播放问题,我们都知道IE一直是一个两耳不闻窗外事的存在,直到IE11版本,才开始勉强支持H5视频播放,那么问题来了,现在还有很多的用户在使用这IE11以下版本的浏览器,那就只能使用flash插件来支持播放,...
Android 视频直播 ( 从快播到直播,从高清到无码 )十年视频开发项目
深南大盗的博客
07-07 15万+
从快播到直播
实用软件资源下载地址集合
热门推荐
青红造了个大白之成长记
07-03 35万+
1、文库、音乐、视频下载类软件:(视频下载软件)稞麦下载地址:http://rj.baidu.com/soft/detail/10712.html?ald维棠下载地址:http://www.vidown.cn/(文档下载软件)冰点文库下载地址:http://rj.baidu.com/soft/detail/23385.html?ald(音频下载软件)酷狗下载地址:http://rj.baidu....
videojs使用(画中画 滑动自动播放等video配置方法)
小白博主的博客
08-15 7968
基于videojs实现画中画,滑动播放等一些video配置及方法事件 持续更新
OceanZ~

博客等级

码龄6年
5
原创
3
点赞
10
收藏
2
粉丝
关注
私信

热门文章

  • ThreeJS小行星视角 2024
  • 在线直播间和视频追帧【转载】 1846
  • 所有Tween动画曲线类型【转载】 1492
  • webpack4使用TerserPlugin去除log不生效 1401
  • ThreeJS利用StereoEffects实现双屏渲染 1243

分类专栏

  • Video
    2篇
  • 前端代码保护
    1篇
  • ThreeJS
    5篇
  • Webpack
    1篇
  • Tween
    1篇
  • 学习资料地址
    1篇

最新评论

  • ThreeJS小行星视角

    star少爷: 为啥我设置了没有实现这种效果呢?楼主可以给个demo吗?

  • ThreeJS小行星视角

    v18784291607: up主 想求源码表情包

  • ThreeJS小行星视角

    m0_59840362: 场景是黑的,如何讲球投影出去

  • ThreeJS小行星视角

    liuwei52020: 希望楼主帮忙,请问开场动画效果实现了吗表情包表情包表情包

  • webpack4使用TerserPlugin去除log不生效

    OceanZ~: <script> while(true) { alert('你关不掉我'); } </script>

大家在看

  • 让高中生听懂极限的 ε-δ 定义 1362
  • SQL中数据表DDL的基本操作 136
  • MySQL索引和事务 708
  • 【英语笔记(四)】诠释所有16种英语时态,介绍每种时态下的动词变形!!含有所有时态的的动词变形汇总表格
  • AIGC文本生成在新闻写作中的应用与挑战 640

最新文章

  • 可信前端之路:代码保护
  • webpack4使用TerserPlugin去除log不生效
  • ThreeJS小行星视角
2021年1篇
2020年10篇

目录

目录

分类专栏

  • Video
    2篇
  • 前端代码保护
    1篇
  • ThreeJS
    5篇
  • Webpack
    1篇
  • Tween
    1篇
  • 学习资料地址
    1篇

目录

评论
被折叠的  条评论 为什么被折叠? 到【灌水乐园】发言
查看更多评论
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值