网络视频播放卡顿原因分析

一、问题描述

    某项目通过拉摄像机rtsp流转rtmp/http-flv/ws-flv的方案,使用户可以在网页中观看摄像机的视频画面。在 观看视频时偶发出现卡顿现象。

二、卡顿现象分析和解决

    此问题涉及的原因较多,所以得考虑各环节的问题可能性,并根据现场实际情况进行处理。整个项目的视频链路为摄像机(rtsp服务器) -> 推流端(将摄像机rtsp转rtmp) -> 流媒体服务器(转协议,将rtmp转为http-flv/ws-flv) ->  外网服务器(提供互联网访问连接的主机电脑,让用户可以在外网观看最终转出来的视频)。 
    可以看到链路比较多,当出现卡顿问题时需要从摄像机排查到推流端、流媒体服务器......外网再到播放器。我们可以一步步通过ffplay/vlc等播放器播放摄像机rtsp,内网播放http-flv/ws-flv,再到外网播放转出来的流来一步步排查是哪个链路出现问题。

(一)推流端

1.推流端硬件条件限制

    使用推流工具(比如FFmpeg)推流(转码) 时,码率、帧率或编码档位设置得过高,但硬件条件存在限制(推流软件 所在电脑的 CPU 性能较差),导致编码速度变慢,无法达到流畅播放的帧率要求。 如果推流端所在电脑的整体 CPU 使用率超过80% ,那么视频的采集和编码都会受到影响,无法正常发挥作用;如果其 CPU 使用率达到 100%,那么推流端本身就已经很卡,观众端要有流畅的观看体验显然是不可能的。在Windows上可以使用任务管理器,Linux上使用top命令查看进程的CPU使用率。
解决方法:
    尝试降低码率、帧率的设置,检查卡顿现象是否有好转。如果发生好转,可以考虑升级推流端所在电脑的硬件配置;或者不转码仅仅进行转封装 进行推流。

2.系统资源占用

检查推流端 所在电脑后台是否运行了大量的程序,建议删除和停止正在运行的程序,空出资源。

3.推流帧率过低

    人眼识别为流畅的视频需要 FPS 每秒 15 帧以上。如果 FPS 低于 10 帧,画面就会出现较明显的卡顿。如无特殊情况,尽量将视频帧率设置在每秒15 帧之上,如果摄像机画面本身变化就很少,如静态画面或PPT 播放等场景,则不受该原因影响 。虽然视频的帧率越高画面流畅感越强,但是帧率超过每秒 30 帧 后,人眼就无法识别出画面的效果,帧率增加也会增加视频传输的带宽成本,建议合理设置该参数。
解决方法:
    在推流指令中更改推流的帧率;或者更改摄像机自带配置网页中的设置,在里面更改帧率。

(二)流媒体服务器端

1.GOP缓存功能

    为了保证视频的秒开以及降低视频的卡顿,一般的流媒体服务器默认会缓存数秒的数据,这一般叫 GOP缓存功能。比如缓存 180 秒的帧数据 , 任何终端播放的时候都是从 180 秒前进行播放 , 这样就至少保证 不会出现卡顿,但这样做延时会很大。部分流媒体服务器,比如开源的zlmediakit 并没有该功能。

2.自适应码率技术

自适应码率技术可以: 1. 让播放体验更加智能。例如,用户在一个不确定的网络环境下,不知道什么 清晰度最合适,选择高清晰度,卡了;选择低清晰度,画质体验又不好。自适应码率就是要解决这个选 择问题,智能匹配最合适的清晰度,避免用户自己反复去尝试;2. 避免播放卡顿。高清视频,在网络限 速或者更常见的4G 下,网络波动大,自适应码率可以实时地调节清晰度,在保证用户观看更高清晰度的 情况下,避免播放卡顿。
自适应码率技术原理:
第一步,原始的视频资源文件,它可能只有一个比较高的清晰度;
第二步,生产端对视频进行转码和切片,根据播放需要,转码成不同清晰度的码流。一般清晰度越高,
码率越高,文件越大。每个码流都切分成时间对齐的分片,一般是 10s
第三步,在转码和切片之后,经过 CDN 节点在网络上进行分发;
第四步,各自适应码率的算法(基于带宽速率、 基于播放器 Buffer BBA 算法 、 MPC 算法 、基于机器
学习)按策略选择需要的清晰度;
第五步:客户端下载这个清晰度的分片文件,进行播放。

3.抗丢包技术

    由于网络的不稳定,丢帧的情况时有发生,为了避免花屏,部分播放器会把丢失参考帧的视频丢掉, 其会无法渲染新的数据,这就会导致视频出现卡顿的问题。所以服务端一般会综合运用前向纠错、后向 补偿、丢包补偿技术使得在丢包率极高的环境下也能流畅直播。

(三)播放端

1.播放端硬件条件限制

    使用播放器播放音视频时,电脑的cpu或者gpu占用达到100%,意味着电脑正在全力运转,处理器已经没有剩余资源来处理其他任务了。这就可能会导致视频卡顿、画面不流畅等问题。
解决方法:升级播放端电脑硬件,使用更高端的cpu和gpu;降低视频质量,降低视频的分辨率、码率、帧率等参数;关闭其它应用程序。

2.播放器缓冲区过小

一般的网络播放器都会有缓冲区抵抗网络抖动、抵抗解码抖动、避免被动丢帧导致花屏。缓冲区设置得过小,网络抖动时就可能会卡顿。但是缓冲器过大,则会导致内存占用高、播放延时大。
针对网络抖动:大部分播放器是接收缓存后才进行解码显示的,接收缓存的大小也会影响播放的流畅 度。所以可以通过调整接收缓存的大小,减少卡顿的影响。通过计算网络延迟来知道网络抖动的大小, 这样设置合适的缓冲区大小用来存储接收到的数据包。假设一开始网络抖动过大,这时播放器可以创建 一块buffer 用来接收数据,但不及时的送去给解码处理或者渲染处理,而是等待网络抖动大小设置的延 迟时间到了才把buffer 里的数据提供给解码或者渲染。这块 buffer 里含有多个视频帧数据,这样解码器 从buffer 里获得的数据就是时间连续的,这样就不会出现视频忽快忽慢的情况,而是看起来很平滑顺畅。但是使用jitter buffer,渲染的视频就会和源视频有较大的延迟,这是不可避免的。

3.部分播放器特性导致

部分开源播放器比如flv.js本身存在特性(bug),使用追帧策略时,跳帧会有明显卡顿,并且画面不连续。
解决方法:更换更好的播放器,不要用flv.js。

(四)带宽不足

1.上行带宽不足

    上行是指从用户设备(如电脑、手机)发送数据到互联网或其他网络的过程。在宽带网络中,上行通常用于上传文件、发送电子邮件、进行视频通话等。 上行带宽 不足或网络发生抖动,导致数据发送速率下降,无法达到流畅播放的帧率要求。 推流端在推流 时会源源不断地产生音视频数据,如果推流端的上传网速太小,那么产生的音视频数据都会被堆积在推 流端所在的电脑里传不出去,上传阻塞导致全部观众(全部播放端)的观看体验都很卡顿 。特别是推流 端所在电脑连接了 wifi Wi-Fi 信号受建筑墙体的屏蔽干扰很严重,而一般的建筑很少在装修时考虑好 Wi-Fi 路由器和各个房间的信号衰减问题。可以使用网速测试工具 Speedtest 测试当前网络的上行带宽情 况。
例子:
如下图所示,用Speedtest测到流媒体服务器所在电脑的上传带宽是40.55Mbps
·
但是通过任务管理看到该电脑每秒发送62.2Mbps的数据到互联网上,62.2Mbps > 40.55Mbps,所以就会出现观看视频卡顿现象。
解决方法:
针对上行带宽不足: 向运营商申请更多的带宽; 降低推流码率; 用摄像机的次码流作为输入(相同 环境下,次码流占用的带宽小,具体可进入摄像机配置网页的中调节); 无人观看不取流处理,当没有对应客户端 / 前端播放视频时让推流端 停止对应的推流,从而节约带宽。

2.下行带宽不足

下行是指从互联网或其他网络接收数据到用户设备的过程。在宽带网络中,下行通常用于下载文件、浏览网页、观看视频等。 下行带宽不足,即观众的下载带宽跟不上或者网络波动较大,例如直播流的码率是2Mbps 的,也就是每秒钟有2M 比特的数据流要下载下来,但如果观众端的带宽不够,就会导致观众端播放体验非常卡顿。 下行不佳只会影响当前网络环境下的观众。解决方法与上行带宽不足的解决方法相同。

三、参考

《 【音视频技术】播放器缓冲区管理》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/191173.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue常见的实现tab切换的两种方法

目录 方法一&#xff1a;事件绑定属性绑定 效果图 完整代码 方法二&#xff1a;属性绑定 动态组件 component标签 效果图 完整代码 方法一&#xff1a;事件绑定属性绑定 效果图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta c…

5.前端--CSS-基本概念【2023.11.26】

1. CSS 语法规范 CSS 规则由两个主要的部分构成&#xff1a;选择器以及一条或多条声明。 属性和属性值之间用英文“:”分开 多个“键值对”之间用英文“;”进行区分 选择器 : 简单来说&#xff0c;就是选择标签用的。 声明 &#xff1a;就是改变样式 2.CSS引入方式 按照 CSS 样…

有了倾斜摄影,如何搭建一座智慧城市?

随着无人机航测、倾斜摄影等全新一代测绘信息技术方法的发展&#xff0c;可以迅速搜集制作精细化的城市三维模型&#xff0c;搭建城市地理信息基础服务架构。 近期都在重点关注的“智慧城市”究竟是什么&#xff0c;有什么重大作用&#xff0c;同时又面临着什么难关&#xff0c…

物联网AI 无线连接学习之蓝牙基础篇 协议的发展

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 蓝牙由来 “蓝牙”&#xff08;Bluetooth&#xff09;原是一位在10世纪统一丹麦的国王哈拉尔 (HaralBluetooth)&#xff0c;他将当时的瑞典、芬兰与丹麦统一起来。而将“蓝牙”与后来的无线通讯技术标准关联…

正则化与正则剪枝

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 引言正则化为什么会过拟合拉格朗日与正则化梯度衰减与正则化 应用解决过拟合网络剪枝 …

【Amazon】在Amazon EKS集群中安装部署最小化KubeSphere容器平台

文章目录 一、准备工作二、部署 KubeSphere三、访问 KubeSphere 控制台四、安装Amazon EBS CSI 驱动程序4.1 集群IAM角色建立并赋予权限4.2 安装 Helm Kubernetes 包管理器4.3 安装Amazon EBS CSI 驱动程序 五、常见问题六、参考链接 一、准备工作 Kubernetes 版本必须为&…

Jmeter性能综合实战——签到及批量签到

提取性能测试的三个方面&#xff1a;核心、高频、基础功能 签 到 请 求 步 骤 1、准备工作&#xff1a; 签到线程组 n HTTP请求默认值 n HTTP cookie 管理器 n 首页访问请求 n 登录请求 n 查看结果树 n 调试取样器 l HTTP代理服务器 &#xff08;1&#xff09;创建线…

VMware安装部署kail镜像服务器【详细包含百度云盘镜像】

VMware安装部署kail镜像服务器【详细包含百度云盘镜像】 kail是一个很好玩的操作系统&#xff0c;不多说了哈 下载kail镜像 kail官网:https://www.kali.org/get-kali/#kali-platforms 百度云盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1PRjoP_1v8DEZ7-dA_…

JVM基础篇:垃圾回收

1.前言 1.1C/C的内存管理 在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再使用&#xff0c;需要手动释放&#xff0c;否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收&#xff0c;而需要程序员编写代码进行回收的方式为手动回收。内存泄漏指的…

【计网 可靠数据传输RDT】 中科大笔记 (十 一)

目录 0 引言1 RDT的原理RDT的原理&#xff1a; 2 RDT的机制与作用2.1 重要协议停等协议&#xff08;Stop-and-Wait&#xff09;:连续ARQ协议: 2.2 机制与作用实现机制&#xff1a;RDT的作用&#xff1a; &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#x…

Git远程仓库常用开发命令和理解

远程仓库 创建与合并分支 每次提交&#xff0c;Git都把它们串成一条时间线&#xff0c;这条时间线就是一个分支。截止到目前&#xff0c;只有一条时间线&#xff0c;在Git里&#xff0c;这个分支叫主分支&#xff0c;即master分支。 HEAD严格来说不是指向提交&#xff0c;而…

基于springboot学籍管理系统

一、设计目的 1. 复习、巩固Java语言的基础知识&#xff0c;进一步加深对Java语言的理解和掌握&#xff1b; 2. 课程设计为学生提供了一个既动手又动脑&#xff0c;独立实践的机会&#xff0c;将课本上的理论知识和实际有机的结合起来&#xff0c;锻炼学生的分析解决实际问题…

系列十八、Spring bean线程安全问题

一、概述 我们知道Spring中的bean&#xff0c;默认情况下是单例的&#xff0c;那么Spring中的bean是线程安全的吗&#xff1f;这个需要分情况考虑&#xff0c;bean中是否存在成员变量&#xff1f;bean中的成员变量是怎么处理的&#xff1f;...&#xff0c;针对bean的状态会有不…

OpenGL的学习之路 -5

1.视景体 正交投影 人眼看世界&#xff0c;有一个可见范围。范围内可见&#xff0c;范围外不可见。视景体就是这么一个概念。 &#xff08;上图仅学习记录用&#xff09; 在OGL中&#xff0c;有两种投影方式&#xff0c;对应两种视景体。第一种&#xff0c;正交投影&#xf…

Flask学习二:项目拆分、请求与响应、cookie

教程 教程地址&#xff1a; 千锋教育Flask2框架从入门到精通&#xff0c;Python全栈开发必备教程 老师讲的很好&#xff0c;可以看一下。 项目拆分 项目结构 在项目根目录下&#xff0c;创建一个App目录&#xff0c;这是项目下的一个应用&#xff0c;应该类似于后端的微服…

案例029:基于微信小程序的阅读网站设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

为什么PCB板大多数都是绿色的?

什么时候开始接触到PCB板的呢&#xff1f;也许是是把家里的电视遥控器拆开的时候&#xff0c;也许是你的小霸王学习机游戏手柄给按坏拆开的时候&#xff0c;也许那时候你还不知道这叫PCB电路板。然后就是大学里使用嘉立创免费打板的时候&#xff0c;有一个选项绿色板还是黑色板…

自建CA实战之 《0x01 Nginx 配置 https单向认证》

自建私有化证书颁发机构&#xff08;Certificate Authority&#xff0c;CA&#xff09;实战之 《0x01 Nginx 配置 https单向认证》 上一篇文章我们介绍了如何自建私有化证书颁发机构&#xff08;Certificate Authority&#xff0c;CA&#xff09;&#xff0c;本篇文章我们将介…

单细胞seurat入门—— 从原始数据到表达矩阵

根据所使用的建库方法&#xff0c;单细胞的RNA序列&#xff08;也称为读取&#xff08;reads&#xff09;或标签&#xff08;tags&#xff09;&#xff09;将从转录本的3端&#xff08;或5端&#xff09;&#xff08;10X Genomics&#xff0c;CEL-seq2&#xff0c;Drop-seq&…

Java 文件常用操作与流转换

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…