视频播放问题和提高性能方案

1.Five symptoms of poor video performance

1.1 视频加载缓慢

Perceived Wait Time

Time to first frame (TTFF):

​ 播放开始所需的adaptive bitrate(ABR)流媒体段的数量。(我们稍后将对此进行更详细的讨论。)

​ 视频请求发送到视频加载之间的时间(即接收到足够的数据来渲染第一帧)。如果客户端实现预取或在本地存储视频的副本,则它可能比PWT高得多。

Network-level metrics

​ 用于连接性能分析的技术指标。这包括DNS解析时间、连接握手时间、下载速度和带宽利用率。

1.2 Video pauses randomly:

​ try to measure the issue with these metrics:

Number of stalls per-play:

视频回放暂停并进入“缓冲”状态的频率。这是加权的视频长度时,我们聚合多个回放会话。

Time-to-resume (lag length):

从用户看到停止播放的视频到重新播放的时间。

1.3 Low picture quality

性能差的另一个症状是图像质量低,这通常是由于没有足够的带宽来提供更高质量的视频流的结果。这也可能是由于视频优化不佳或基础设施滞后造成的。为了确定它是哪个场景,我们回顾以下指标:

  • Video variant usage

    测量在单个ABR段水平上使用和计数每个视频变体的次数。

  • A number of variant changes during playback

    视频改变显示给用户的变量的频率。

  • Bandwidth utilization

    视频流占用了多大的可用带宽

1.4 When seeking (scrubbing) through a video it takes a while for it to resume

​ 我们使用称为“特技模式延迟”的指标来监控此滞后。

1.5 Video is out of sync with audio or doesn’t play altogether

​ 这种现象可能是由多种原因引起的,但通常是由于终端设备功率不足所致。 为了更好地理解此问题,我们使用了有关设备功能的信息,包括有关我们使用的编解码器的硬件支持数据以及回放过程中设备资源利用率的数据。

2 我们的补救措施:调整良好的自适应比特率(ABR)流

为了实现高效的流传输并减轻上面列出的一些问题,我们使用了自适应比特率流传输,这是当前视频交付的行业标准。 ABR流的两种最流行的实现是Apple的HLS和MPEG-DASH。 这两种技术都通过将源视频文件编码为具有不同比特率的多个流而起作用。 然后,这些流将以相似的持续时间(例如几秒钟)分成较小的段。 然后,视频播放器会根据可用带宽和其他因素在流之间无缝切换。 这样,当信号较差时,视频仍可以播放(质量较低),而当信号增强时,视频可以跳至较高质量的视频流。

2.1 Tuning ABR streaming

使用ABR的棘手部分是对每个流的配置进行微调,以使它们在产品中发挥最佳性能。 值得一提的是,没有一种配置可以普遍应用于所有产品。 这是一种高度针对产品的设置,会随着时间的推移而变化。 在Pinterest,我们主要处理简短的预生成内容(例如VoD),当用户滚动浏览其家庭供稿时,这些内容会自动播放。 它主要用于带宽可能受到限制的各种移动设备上。 让我们讨论可以调整哪些参数以满足该条件。

整个过程本质上都是“漂洗和重复”。 您选择起始参数,观察回放如何在实时流量上执行,并根据这些信号调整您的配置。 随着网络基础架构和设备功能的不断变化,您可能需要继续更新配置。 收集上述指标确实可以简化流程。

Number of streams, resolutions and bitrates

我们最初决定要提供多少个流以及要使用哪些分辨率是基于两条信息。 首先,我们对可能出现视频的所有产品表面及其尺寸都有很好的了解。 其次,我们利用我们所运营的主要市场中可用的网络基础设施的知识来设置初始比特率。

推出初始设置后,我们便开始收集指标:PWT,TTFF,视频播放器多久更改一次使用的流以及我们的流表示可用带宽的紧密程度。 根据这些信号,我们进一步调整了设置以最小化PWT。

Frame rate

您为视频流选择的帧速率会显着影响平滑播放所需的必要带宽。 它还可能会改变视频的感觉。 有三种常用的流帧率。

24fps:过去在电影院中使用。 在现代设备上可能有点生涩。
30fps:这是大多数流媒体服务的标准,并且对于大多数类型的内容都表现良好。 快速动作序列(例如运动)和想要“真实生活”效果的情况(例如新闻,戏剧,自然视频)可以从更高的帧频中受益。
60fps:这非常接近人眼可以处理的信息量。 除非您打算在播放过程中放慢视频播放速度,否则通常不会超出此级别。 它通常用于高节奏的场景,以及当您想要视频的“真实生活”时。 这不是一种很棒的电影体验,因为它看起来像真实的生活,并且揭示了太多的细节(例如,化妆,服装,风景中的瑕疵)。 因此,观看者不会像使用30fps(甚至24fps)的电影那样感受到“电影魔力”。 但是,这对于快速动作游戏非常有用。

对于我们的用例,根据经验,30 fps帧速率效果很好。 随着媒体库的发展,我们计划向某些媒体文件添加60fps的变体。 值得一提的是,降低帧速率以获得最低质量的比特率是有意义的。 对于Pinterest,我们以15帧/秒的速度对视频进行重新编码,因为我们发现,用户对视频停滞不满意,而对视频的视线略有些生涩。

Segment size and duration

在互联网上有许多关于段持续时间的建议。 很长一段时间以来,Apple建议的段时间为10s,最近他们将HLS流的段时间修改为6s。 最适合Pinterest的分段持续时间为4s。 我们使用以下准则来做出此决定

  • 一些视频播放器(最著名的是iOS AVFoundation)会在实际开始播放之前加载一些视频片段。 对于高质量的流和较长的段,这可能会导致很高的PWT。
  • 段越长,根据网络状况的变化进行回放所花费的时间就越长。
  • 使段非常短(例如1s)会导致对服务器的大量请求,从而增加网络和处理开销。
  • 根据经验,每个段的字节大小应小于1MB。 这导致大多数CDN提供者的驱逐率较低。
Video and audio codecs

When deciding which codec to use, there are two limiting factors:

  • 首先是您用于流式传输的技术。 例如,HLS会强制您坚持使用h.264视频编解码器和一些受支持的音频编解码器之一。 DASH可以与编解码器无关,因此更加灵活。
  • 第二个因素是用户设备提供的功能。 Pinterest可在全球范围内使用,我们的许多用户使用的旧设备处理能力有限。 为了他们的缘故,我们使用最广泛支持的配置– h.264编解码器,主要配置文件,级别为3.1,并附带用于音频通道的HE-AAC v1和v2编解码器。
Fine tuning
  • 最后的一些小调整包括选择用于第一段回放的流的质量。 为了使PWT最小化,我们在播放的前四秒使用中等质量的流,而不是使用高质量的流。
  • 另一个设置强制我们的编码器将IDR帧放置在每个段的开头。 这样一来,视频播放器就不必在开始渲染帧之前加载整个片段,从而大大减少了PWT和恢复时间指标。
  • 我们还确保启用特技模式时支持流技术。 HLS和DASH都支持此功能,并启用了性能擦除,从而最大程度地减少了特技模式延迟指标。
  • 最终的优化是确保我们的交付基础架构非常快。 为了保证这一点,我们使用了多个CDN提供商,然后为每个用户选择最快的a。

要使视频播放产品在大型产品中表现出色,需要进行大量调整。 建议使用最适合产品其他流技术和设置。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rabbitmq 不同的消费者消费同一个队列_RabbitMQ 消费端限流、TTL、死信队列

消费端限流1. 为什么要对消费端限流假设一个场景,首先,我们 Rabbitmq 服务器积压了有上万条未处理的消息,我们随便打开一个消费者客户端,会出现这样情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法同时处理这…

动量策略 python_在Python中使用动量通道进行交易

动量策略 pythonMost traders use Bollinger Bands. However, price is not normally distributed. That’s why only 42% of prices will close within one standard deviation. Please go ahead and read this article. However, I have some good news.大多数交易者使用布林…

css3 变换、过渡效果、动画

1 CSS3 选择器 1.1 基本选择器 1.2 层级 空格 > .itemli ~ .item~p 1.3 属性选择器 [attr] [attrvalue] [attr^value] [attr$value] [attr*value] [][][] 1.4 伪类选择器 :link :visited :hover :active :focus :first-child .list li:first-child :last-chi…

webservice 启用代理服务器

您会发现你写完了一个webservice在调用的时候发现怎也没办法调用,一个简单的webservice怎么不能使用,一肚子的怨恨,哈哈您可能没有为webservice设置代理。 下面就给您写个调用的用例和大家分享下。其实很简单,但是你没有想到的时…

mysql常用的存储引擎_Mysql存储引擎

什么是存储引擎?关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非…

android studio设计模式和文本模式切换

转载于:https://www.cnblogs.com/judes/p/9437104.html

高斯模糊为什么叫高斯滤波_为什么高斯是所有发行之王?

高斯模糊为什么叫高斯滤波高斯分布及其主要特征: (Gaussian Distribution and its key characteristics:) Gaussian distribution is a continuous probability distribution with symmetrical sides around its center. 高斯分布是连续概率分布,其中心周…

C# webbrowser 代理

百度,google加自己理解后,将所得方法总结一下: 方法1:修改注册表Software//Microsoft//Windows//CurrentVersion//Internet Settings下 ProxyEnable和ProxyServer。这种方法适用于局域网用户,拨号用户无效。 1p…

C MySQL读写分离连接串_Mysql读写分离

一 什么是读写分离MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。当然,主服务器也可以提供…

golang 编写的在线redis 内存分析工具 rma4go

redis 内存分析工具 rma4go redis是一个很有名的内存型数据库,这里不做详细介绍。而rma4go (redis memory analyzer for golang) 是一个redis的内存分析工具,这个工具的主要作用是针对运行时期的redis进行内存的分析,统计redis中key的分布情…

从Jupyter Notebook到脚本

16 Aug: My second article: From Scripts To Prediction API8月16日:我的第二篇文章: 从脚本到预测API As advanced beginners, we know quite a lot: EDA, ML concepts, model architectures etc…… We can write a big Jupyter Notebook, click “Re…

【EasyNetQ】- 使用Future Publish调度事件

许多业务流程要求在将来某个日期安排事件。例如,在与客户进行初次销售联系后,我们可能希望在将来的某个时间安排跟进电话。EasyNetQ可以通过其Future Publish功能帮助您实现此功能。例如,这里我们使用FuturePublish扩展方法来安排未来一个月的…

Java这些多线程基础知识你会吗?

0、并发和并行、进程核线程、多进程和多线程的区别: (这里的时间和时刻上的概念同物理上的一样) 并发:在一段时间内多个任务同时执行,或者说是在一段很短的时间内可以执行多条程序指令,微观上看起来好像是可…

MySQL set names 命令_mysql set names 命令和 mysql 字符编码问题

先看下面的执行结果:(rootlocalhost)[(none)]mysql>show variables like character%;---------------------------------------------------------------------------------------| Variable_name | Value |---------------------------------------------------…

设置Proxy Server和SQL Server实现数据库安全

首先,我们需要了解一下SQL Server在WinSock上定义协议的步骤: 1. 在”启动”菜单上,指向”程序/Microsoft Proxy Server”,然后点击”Microsoft Management Console”。 2. 展开”Internet Information Service”,再展开运行Proxy…

Python django解决跨域请求的问题

解决方案 1.安装django-cors-headers pip3 install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS [...corsheaders,...] MIDDLEWARE_CLASSES (...corsheaders.middleware.CorsMiddleware,django.middleware.common.CommonMiddleware, # 注意顺序...…

加勒比海兔_加勒比海海洋物种趋势

加勒比海兔Ok, here’s a million dollar question: is the Caribbean really dying? Or, more specifically, are marine species found on Caribbean reefs becoming less abundant?好吧,这是一个百万美元的问题:加勒比海真的死了吗? 或者…

mysql 查出相差年数_MySQL计算两个日期相差的天数、月数、年数

MySQL自带的日期函数TIMESTAMPDIFF计算两个日期相差的秒数、分钟数、小时数、天数、周数、季度数、月数、年数,当前日期增加或者减少一天、一周等等。SELECT TIMESTAMPDIFF(类型,开始时间,结束时间)相差的秒数:SELECT TIMESTAMPDIFF(SECOND,1993-03-23 0…

tornado 简易教程

引言 回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会有一个对应的线程来用web应用(如Djang…

如果你的电脑是通过代理上网的.就要用端口映射

由于公网IP地址有限,不少ISP都采用多个内网用户通过代理和网关路由共用一个公网IP上INTERNET的方法, 这样就限制了这些用户在自己计算机上架设个人网站,要实现在这些用户端架设网站,最关键的一点是, 怎样把多用户的内网…