当前位置: 首页 > news >正文

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

一、问题描述

    某项目通过拉摄像机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 比特的数据流要下载下来,但如果观众端的带宽不够,就会导致观众端播放体验非常卡顿。 下行不佳只会影响当前网络环境下的观众。解决方法与上行带宽不足的解决方法相同。

三、参考

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

相关文章:

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

一、问题描述 某项目通过拉摄像机rtsp流转rtmp/http-flv/ws-flv的方案,使用户可以在网页中观看摄像机的视频画面。在 观看视频时偶发出现卡顿现象。 二、卡顿现象分析和解决 此问题涉及的原因较多,所以得考虑各环节的问题可能性,并根据现场实…...

Android 相机库CameraView源码解析 (二) : 拍照

1. 前言 这段时间,在使用 natario1/CameraView 来实现带滤镜的预览、拍照、录像功能。 由于CameraView封装的比较到位,在项目前期,的确为我们节省了不少时间。 但随着项目持续深入,对于CameraView的使用进入深水区,逐…...

计算机缺少d3dx9_43.dll怎么办?5个方法快速修复d3dx9_43.dll文件

在计算机使用过程中,我们常常会遇到一些错误提示,其中之一就是“d3dx9_43.dll丢失”。这个问题可能会影响到我们的游戏体验或者软件运行。为了解决这个问题,我查阅了一些资料并尝试了多种方法。在这里,我想分享一下我对d3dx9_43.d…...

2023亚太杯数学建模C题思路分析 - 我国新能源电动汽车的发展趋势

1 赛题 问题C 我国新能源电动汽车的发展趋势 新能源汽车是指以先进技术原理、新技术、新结构的非常规汽车燃料为动力来源( 非常规汽车燃料指汽油、柴油以外的燃料),将先进技术进行汽车动力控制和驱动相结 合的汽车。新能源汽车主要包括四种类型&#x…...

c语言新龟兔赛跑

以下是一个使用C语言编写的新的龟兔赛跑游戏&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>int main() { int distance, turtle_speed, rabbit_speed, turtle_time, rabbit_time, rabbit_lead; srand(time(NULL)); // 随机数种…...

Linux驱动开发——网络设备驱动(理论篇)

目录 一、前言 二、网络层次结构 三、网络设备驱动核心数据结构和函数 一、前言 网络设备驱动是 Linux 的第三大类驱动&#xff0c;也是我们学习的最后一类 Linux 驱动。这里我们首先简单学习一下网络协议层次结构&#xff0c;然后简单讨论 Linux 内核中网络实现的层次结构。…...

simulink仿真

1&#xff09;系统问题 连续系统&#xff0c;离散系统&#xff08;采样周期问题&#xff09; 系统分析问题 2&#xff09;求解器问题 变步长&#xff0c;定步长&#xff0c;步长时间与采样周期问题、 3&#xff09;积分器问题 连续积分&#xff0c;离散积分问题&#xff…...

PC端页面进去先出现加载效果

自定义指令v-loading&#xff0c;只需要绑定Boolean即可 v-loading“loading” <el-table :data"list" border style"width: 100%" v-loading"loading"><el-table-column align"center" label"序号" width"5…...

磁盘清理在哪里?学会这4个方法,快速清理内存!

“在使用电脑的过程中&#xff0c;我可能经常会保存一些文件到电脑上&#xff0c;这也导致电脑经常出现内存不足的情况。我想问问磁盘清理在哪里呀&#xff1f;我应该如何打开呢&#xff1f;” 随着使用电脑的时间增长&#xff0c;用户可能经常会遇到磁盘空间不足的情况&#x…...

Error opening terminal: xterm.”的解决方法

主要是看下面这两个变量是否设置正确 $ echo $TERM $ echo $TERMINFO 通常TERM的默认值为xterm-265color, 要查看支持的term&#xff0c;可以ls -al /lib/terminfo/x/ 如果TERM是xterm-265color的话&#xff0c;TERMINFO设置为/usr/lib/terminfo make menuconfig时提示“Err…...

C#常见的设计模式-结构型模式

引言 设计模式是软件工程中用于解决常见问题的可复用解决方案。在C#编程中&#xff0c;常见的设计模式具有广泛的应用。本篇博客将重点介绍C#中常见的结构型设计模式&#xff0c;包括适配器模式、装饰器模式、代理模式、组合模式和享元模式。 目录 引言1. 适配器模式(Adapter …...

Redis分片备库切换操作

Redis分片备库切换操作 场景描述&#xff1a; 分片集群&#xff1a; 1.ipa:5001-ipa:5002 2.ipb:5001-ipb:5002 需将两个分片备库互置完成灾备 操作步骤 准备工作 主机密码&#xff1a;1qaz!QAZ 获取节点信息命令 /redispath/bin/redis-cli -a password -h ip -p port red…...

二叉树:leetcode1457. 二叉树中的伪回文路径

给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。 给定二叉树的节点数目…...

【【Linux下的Petallinux 以及其他的配置】】

Linux下的Petallinux 以及其他的配置 sudo apt-get install iproute2 gawk python3 python build-essential gcc git make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat chrpath socat xterm autoconf libtoo…...

13、深度学习之神经网络

深度学习是机器学习中重要的一个学科分支,它的特点就在于需要构建多层“深度”的神经网络。 人们在探索人工智能初期,就曾设想构建一个用数学方式来表达的模型,它可以模拟人的大脑,大脑我们都知道,有很多神经元,每个神经元之间通过突触链接。 神经网络的设计就是模仿了这…...

js的数组去重方法

目录 es6数组中对象去重 1. filter()用法 2. findIndex()用法 3. 去重 其他方法&#xff1a; 方法二&#xff1a;reduce()去重 1. reduce()用法 1.1 找出字符长度最长的数组成员。 1.2 扁平化二维数组 1.3 扁平化多维数组 三、总结方案&#xff1a; 使用Set&#xf…...

在 Next 14 的 appRouter 模式中接入 React-Redux

在 Next 14 的 appRouter 模式中接入 React-Redux 说明 Next.js 版本升级到 14 后&#xff0c;相比 13 版本是一个改动很大的大版本升级&#xff0c;很多概念或者使用方式 13 版本都有较大的区别&#xff0c;因此这里记录一些学习 14 版本的 Next.js 的心得体会或者问题。因为…...

aspose-words 跳过证书验证jar

优先用 aspose-words-19.3.jar &#xff0c;不需要读取license.xml&#xff0c;导出后直接水印&#xff0c;jar包最好直接放在项目resource目录下直接引用&#xff0c;要不下载不下来 public static String doc2pdf(String fileName, String filePath) {try {String oldFile f…...

【开题报告】基于uniapp的瑜伽学习交流小程序的设计与实现

1.选题背景 瑜伽在现代社会中越来越受到人们的关注和喜爱。它不仅可以帮助人们塑造健美的身材&#xff0c;还能促进身心健康、提高生活质量。然而&#xff0c;由于瑜伽动作的复杂性和技巧性&#xff0c;很多初学者在学习过程中会遇到困难和挑战。 同时&#xff0c;由于工作和…...

【蓝桥杯单片机】应用手势传感器(串口2)

手势传感器:串口通信,可以识别左滑、右滑、单击三种手势,输出相应的固定串口数据。 控制器:IAP15F2K61S2单片机。 引脚连接: 单片机 手势传感器 P46 -> TX P47 -> RX VCC -> 5V GND->gnd main.c 程序说明:传感器与单片机的串口2进行数据交互,这里使用的是开…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...