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

视频直播技术详解
最新推荐文章于 2024-08-13 14:45:04 发布
转载 最新推荐文章于 2024-08-13 14:45:04 发布 · 1.9k 阅读
· 0
· 4 ·
CC 4.0 BY-SA版权
原文链接:https://www.polyv.net/news/2019/05/cp0191/
文章标签:

#javascript #网络

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
    分享到新浪微博
    扫一扫
  • 举报
    举报
专栏目录
竞技游戏背后的隐形魔法:追帧补帧技术揭秘
本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路!
08-05 329
MOBA游戏中的"追帧补帧"技术是保证竞技公平性和流畅体验的关键。当网络延迟导致数据包丢失或延迟时,系统通过时钟同步和状态快照技术,让客户端快速追赶游戏进度(追帧),并智能预测填补缺失动作(补帧)。这项技术解决了玩家常见的"瞬移""打空"问题,使《英雄联盟》等游戏的团战能保持画面同步。服务器与客户端协同工作,在保证判定公平的同时,通过预测修正和动画平滑处理,为玩家创造无缝的竞技体验。未来AI和边缘计算将进一步提升帧同步技术。
Unity遮挡剔除技术详解——让游戏世界“只看该看的”
本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路!
08-05 219
本文系统介绍了Unity引擎中的遮挡剔除(Occlusion Culling)技术。文章从基础原理出发,阐述了遮挡剔除如何通过空间体素划分和预计算机制,动态剔除被遮挡物体以提升渲染性能。详细讲解了Unity中的实现流程,包括场景设置、Occlusion Area划分、Portal配置和烘焙参数调整。通过实际案例展示了该技术在开放世界、多层地图等场景中的应用效果,分析了性能提升与资源消耗的平衡点。此外,文章还探讨了动态对象处理方案、开发协作建议以及常见问题的诊断方法。最后展望了GPU遮挡查询和AI辅助优化等未
参与评论 您还未登录,请先 登录 后发表或查看评论
flv.js的追帧、断流重连及实时更新的直播优化方案
gw的博客
06-19 5313
flv.js的追帧、断流重连及实时更新的直播优化方案
直播网站理论与实战(Java+FFmpeg+Nginx+HLS+Videojs+VLC)
08-01
我将带领大家使用Java、FFmpeg、Nginx亲手搭建“直播网站”。主要内容包括:1、亲手搭建Java+nginx直播网站,用源码方式编译nginx和rtmp模块。2、亲手搭建FFmpeg环境,并使用命令行进行直播推流。3、亲手搭建Videojs环境,实现网页直播拉流功能。梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。
使用flv.js直播的时候优化的方案
weixin_58775072的博客
03-18 1185
最近在处理前端直播的业务,根据业务需要,使用 flv.js 的方案播放实时的flv视频流。不得不承认,flv.js 是一个伟大的库。在使用flv.js开发的过程中,遇到了一些问题,也无外乎是视频延迟,视频卡顿等问题,经过在github issues里摸爬滚打,加上长时间的试错,将这些问题归纳出了对应的解决方案,也自己封装了一个扩展插件flvExtend。
播放器追帧方案
LZ0422的博客
01-03 1732
总结: 本文针对教育直播类型追帧设计的方案,需要根据不同的直播类型进行选择,具体方案如下: ** 优先推荐:方案二【具体方式3】,原因:给用户更好的体验效果,不会让用户在上课过程中,错过最精彩的时刻;【如有对应条件,也可以选择方案四&方案五】 ** ** 不推荐:方案一&方案三,原因:在网络不稳定情况下,会发生声调变声情况(注意:根据不同设备音频渲染效果不同,导致体验感较差); ** 方案一:音频缓慢追上,视频直接丢掉; 方案二:音视频文件都同时丢掉(可设置丢掉的方式); 1.播放
PLDroidPlayer 是 Pili 直播 SDK 的安卓播放器。支持所有直播常用的格式,如:RTMP、HLS、FLV。拥有优秀的功能和特性,如:首屏秒开、追帧优化、丰富的数据和状态回调、硬解软解
王项雨 的博客
01-09 4204
PLDroidPlayer 是 Pili 直播 SDK 的安卓播放器。支持所有直播常用的格式,如:RTMP、HLS、FLV。拥有优秀的功能和特性,如:首屏秒开、追帧优化、丰富的数据和状态回调、硬解软解支持。而且可以根据自己的业务进行高度定制化开发。 https://github.com/pili-engineering/PLDroidPlayer
直播间自动评论软件直播间自动发言工具直播间自动评论脚本短视频自动回复短视频自动评论直播间自动喊话神器直播间自动评论点赞
最新发布
11-18
直播间自动评论软件直播间自动发言工具直播间自动评论脚本短视频自动回复短视频自动评论直播间自动喊话神器直播间自动评论点赞 抖音直播间自动评论软件直播间自动发言工具直播间自动评论脚本短视频自动回复短视频...
解决抖音短视频和直播间不适宜视频课程-网盘链接提取码下载 .txt
02-07
本套课程深度分析账号不适宜加热原因、如何排查与应对方案,解决成功率达不到100%,只要不是小黑屋账号,解决成功率均高于90%。 视频大小:570MB
GSYVideoPlayer仿抖音、头条视频列表,播放直播流和小视频,左右VP+Fragment+RV 还附送点赞动画效果
10-26
GSYVideoPlayer仿抖音、头条...这里做了三个列表,分别是满屏播放、自适应播放两种模式,以及RV滑动自动播放当前的视频(效果和今日头条或者微信朋友圈一致)。内容分别有m3u8直播流、mp4小视频。还附送点赞动画效果。
一对一视频社交原生交友双端APP系统源码带同城直播间视频聊天系统
08-06
高清视频聊天直播间,按分钟计时付费,可进行美颜设置、送礼打赏、发送消息内容。 一对一语音聊天;按分钟计时付费,主播和用户可以进行一对一语音聊天,支持送礼打赏。 主播详情页介绍;主要分为两部分显示,优先...
Android项目源码基于RTMP和RTC混合引擎的在线视频连麦互动直播
07-29
在本文中,我们将深入探讨基于Android的在线视频连麦互动直播项目,该项目利用了RTMP(Real-Time Messaging Protocol)和RTC(Real-Time Communication)混合引擎。首先,我们需要明确,这个项目是使用Android ...
视频直播关键技术:流畅、拥塞和延时追赶
weixin_34177064的博客
08-07 324
这两年互联网领域的一个热门关键词就是视频直播,从刚开始的游戏直播和秀场娱乐开始,现在各个行业里都植入了直播元素。网易云信多年以来,一直深耕于音视频领域,这篇文章将和大家聊一聊视频直播的几个关键技术。 相关阅读推荐《如何快速实现移动端短视频功能?》 《视频私有云实战:基于Docker构建点播私有云平台》清晰度 4K、1080p、720p,这些概念被各大电视机厂商炒作了这么多年,已经地球人都...
小飞机工作笔记(二)追帧与快照同步
weixin_34146805的博客
07-23 617
还是先说下追帧的问题吧。飞机项目采用的是帧同步的方案,渲染层与逻辑层分离,由定时器一秒20帧来驱动逻辑层做update,而对于渲染层则是以一秒40帧的速度来驱动。渲染层轮循逻辑层做插值。在网络抖动的情况下,本地演算的帧LocalFrameId可能会落后或领先服务器下发的ServerFrameId。顺便提一句,ServerFrameId在这里主要是为了给各个客户端一个统一的参照系,并不会在F...
Android IjkPlayer内核编译记(二)RTMP追帧优化
YangLe
07-26 1597
使用IjkPlayer内核播放RTMP视频流的时候,在网络不好的情况下,延迟会越来越高,因为项目对视频实时性有一定的要求,最近一直在解决这个问题,看了下源码中的Issues,发现很多人也遇到了这个问题,一通参数设置下去效果有点改善但不多,也试过编译别人已经改好的版本,发现效果也不太理想,无它,只能自己动手改改了。先说下为什么会发生延迟的现象,本文只讨论拉流端的优化,当然实际项目应用的时候,推流端也要一起优化下。
Unity基础学习六,网络同步
u013617851的博客
02-15 9265
1.什么是网络同步 所谓同步,就是要多个客户端表现效果是一致的,比如我们玩王者荣耀的时候,需要十个玩家的屏幕显示的英雄位置完全相同、技能释放角度、释放时间完全相同,这个就是同步。 2.为什么要有网络同步 略 3.如何使用网络同步,使用网络同步的不同方案比较。 3.1状态同步 将其他玩家的状态行为同步的方式(请求其他玩家的状态并显示在NPC上),一般情况下AI逻辑,技能逻辑,战斗计算都由服务器运算,将运算的结果同步给客户端,客户端只需要接受服务器传过来的状态变化,然后更新自己本地的动作状态、B..
flv.js 使用说明
m0_67793437的博客
08-13 6594
flv.js是一个基于 HTML5 Video 标签和 Media Source Extensions(MSE)实现的纯 JavaScript FLV 视频播放库。它允许用户在浏览器中直接播放 FLV 格式的视频,而不需要安装额外的插件。该库的目标是提供一个轻量、易用且功能强大的解决方案来处理 FLV 视频。flv.js的核心原理是利用 MSE API 将 FLV 流分段加载并传递给 Video 标签。
Js网络视频播放器之VideoJs&&ckplayer(直播拉流rtmp、hls)
热门推荐
风清扬的博客
04-19 2万+
一、轻量级的开源播放器VideoJs&&Ckplayer 1、videoJS 对于HTML5支持非常棒,可以自动在flash和Html5播放器之间进行切换,videoJS可以兼容到IE8,它提供的界面非常简洁,需要对界面进行二次开发。 获取videoJs 2、ckPlayer 这个播放器是国产播放器,功能有很多,只简单介绍两个功能,(1)提供手动切换html5和f
修改 video.js 默认 bufferTime
weixin_30306905的博客
04-27 1131
1、自建rtmp推流、转发、播放,前端用video.js 发现总延时在2秒多,服务器已优化,看看video.js能否优化 2、引用:在RTMP播放器侧,很重要的一点是:在 NetStream.setBufferTime() 方法中讲参数设置为0(在Actionscript 3上,请使用"NetStream.bufferTime = 0;")。 这将让你的播放器获得最低的延时效果。 ...
OceanZ~

博客等级

码龄7年
5
原创
4
点赞
11
收藏
2
粉丝
关注
私信

TA的精选

  • 新 可信前端之路:代码保护

    514 阅读

  • 新 webpack4使用TerserPlugin去除log不生效

    1442 阅读

  • 热 ThreeJS小行星视角

    2176 阅读

  • 热 所有Tween动画曲线类型【转载】

    1573 阅读

  • 热 ThreeJS利用StereoEffects实现双屏渲染

    1319 阅读

查看更多

大家在看

  • Java 8函数式编程精讲 711
  • MyBatis分页方案深度解析 751
  • 南方CASS 11安装与功能详解 503
  • Spring Boot周边游平台设计与实现 648
  • Java数据结构与集合框架全解析 251

TA的历史创作历程

2021年 1篇
2020年 10篇

分类专栏

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

展开全部 收起

上一篇:
所有Tween动画曲线类型【转载】
下一篇:
ThreeJS小行星视角

目录

展开全部

收起

目录

展开全部

收起

上一篇:
所有Tween动画曲线类型【转载】
下一篇:
ThreeJS小行星视角

分类专栏

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

展开全部 收起

目录

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
表情包 代码片
  • HTML/XML
  • objective-c
  • Ruby
  • PHP
  • C
  • C++
  • JavaScript
  • Python
  • Java
  • CSS
  • SQL
  • 其它
 条评论被折叠 查看
被折叠的  条评论 为什么被折叠? 到【灌水乐园】发言
查看更多评论
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值