卡顿率:用于体现视频流畅性的指标,测试周期内的卡顿总时长/测试总时长 *100%,卡顿率越高,主观体验越差。
———————————————————————————————————————————————————————
帧率:接收端观测到的渲染帧率,帧率越高,流畅性越好。
———————————————————————————————————————————————————————
业界测试流畅性测试方法为:
通过自动化录制的测试视频;
利用 FFmpe 选择兴趣区域进行截取;
拿到兴趣区域进行视频前 10s,中间 10s,后 10s 视频;
把三段 10s 的视频进行每 50ms 一张图片;
通过 opencv 进行图片的分析。
———————————————————————————————————————————————————————
主观画质:
实验室测试方法
观察视频画面质量给出主观画面质量等级评价。
10 分:运动球体清晰,主播轮廓清晰,主播五官清晰,主观感受画质清晰无损
9 分:运动球体清晰,主播轮廓清晰,主播五官有轻微马赛克。
8 分:运动球体清晰,主播轮廓清晰,主播五官有马赛克。
7 分:运动球体较清晰,主播轮廓较明显,主播五官较糊,有块状马赛克。
6 分:运动球体较糊,主播轮廓较明显,主播五官较糊,有大量马赛克。
5 分:运动球体模糊,主播轮廓模糊,面部有较多马赛克。
4 分:运动球体糊,主播脸大糊,有较多马赛克。
3 分:运动球体糊,主播脸大糊,有大量马赛克。
2 分:运动球体大糊,主播脸大糊,五官不明显,有大量马赛克。
1 分:画面整体大糊,辨识度低。
———————————————————————————————————————————————————————
首帧出图
从进入频道到看到对端画面的时间,单位:ms,首帧出图越快越好,至少要达到 1 秒内显示。
简单来讲,视频首帧出图就是视频首帧加载出图的时间,那么这个时间怎么来计算呢?
要想计算出视频首帧加载的时间,我们就需要找到视频首帧加载的标志是什么,也就是我们怎么确定首帧是否加载了,在哪加载的?
这里我们采用的办法是通过播放视频后定时截取图片的方式,找到第一张跟基准图片相似度达到 90% 的图片,就是首帧图片,然后从点击进入频道的系统时间到接收到这张图片的系统时间,这个时间差就是视频首帧加载时间。
实验室测试方法
手机 1 先进入频道;
手机 2 反复进出 10 次相同的频道,每次在频道内的时间约 10s,在频道外的等候时间约 10s;
在录制设备上用固定帧率(如 30 帧/秒)录制手机 2 进出频道的整个过程;
将录制好的视频倒入电脑,打开视频编辑软件 Final cut Pro,并导入该视频。在软件中检索录制的视频帧,找出所有点击 “进入频道” 按钮的帧(图 3),和所有首帧出现的帧(图 4)。由于录制的视频时 30 帧/秒的固定帧率,我们用帧号相减,就得到了两个事件中间隔了多少帧。再按照每帧 1/30 秒,就可以快速计算出每次进入频道的时间;
首帧出图时间=[c30+d-(a30+b)]*1000/30,10 次出图时间取平均值;
———————————————————————————————————————————————————————
音画同步:
所谓音画同步,其原理是对直播进行录像,通过分解录制视频的音频视频文件得出图像时间、音频时间,二者差值得出同步延时差。
音画同步反映视频和音频的同步程度,音画同步的标准是 -200ms 至 200ms,表示:音频最大可以超前视频 200ms,视频最大可以超前音频 200ms。音画同步延迟越靠近 0,同步效果越好。
目前常见的测试音画同步的方式,是由测试人员观看视频,并对比视频画面中人物的唇动和听到的声音是否同步。由于测试人员的个体差异,会有 200ms 左右的误差,因而,需要对视频的音画是否同步进行客观的测试。
———————————————————————————————————————————————————————
▎实验室测试方法
手机 1 和手机 2 进入同一个频道;
电脑上循环播放测试用视频文件;
将手机 1 后置摄像头正对着电脑屏幕,采集正在播放的同步视频源,保证能在手机 2 端完整地看到红色矩形框以及数字(图 5);

将手机 2 移到另一个房间,为了防止电脑播放的声音干扰到手机 2 上播放的声音被正确采集。调整电脑播放音量,保证能在手机 2 端较大声地听到滴滴的声音;
用 iPhone 录制手机 2 的播放视频和声音,摆放位置如下图 6 所示;
带宽跟踪
带宽跟踪,即检测频道内码率传输的大小。
业界测试方法有使用 ping 测试网络,使用测试网站,使用路由跟踪等来测试视频带宽,实验室是通过 wireshark(网络数据包分析软件)截取网络数据包,来分析视频的带宽大小。
▎实验室测试方法
手机连接电脑后,打开 Xcode,然后选择 window-->Device and Simulator-->Device 选中自己的手机,就能看到信息,"Identifier"这一栏,便是 UDID;
创建 RVI 接口,获取虚拟接口。终端输入 $ rvictl -s
打开 wireshark ,在 capture 中选择刚才生成的接口名(例图 9 为 rvi0);
打开 app 开始互通,wireshark 会显示各种各样的的包;
选中发送端(本机)和接受端(服务器)的 ip,一般 Source 出现频率最高为本机 ip,Destination 出现频率最高为服务器 ip。(如图 8 和 9);
复制过滤条件,点击统计,将复制的过滤条件粘贴到显示过滤器一栏中,显示出所抓数据的 I/O 图,便可得到实时通讯的带宽大小(如图 10)
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element