在游戏测试中,音画同步测试是个难点(所谓游戏音画同步:游戏中,音效与画面的同步程度),如今通常采用人工主观判断的方式测试,但这会带来2个问题:windows
本文主要内容:ide
(注:上下文中,游戏默认为PC上的FPS游戏,音画同步默认为PC上FPS游戏的音画同步)函数
若是咱们采用 实时计算 的方案,这将致使该测试对计算机有很高的要求,由于咱们须要对每秒60张1080P-JPEG图片与44100Hz-wav音频进行科学计算。工具
实际上,音画同步测试对实时性并不是硬核要求,并且不管计算是实时或者非实时,被测试的游戏场景音画均需留档,以备问题追查,因此,本方案使用 非实时计算。同时,引入 视频录制,把“游戏音画同步”问题转换为“视频音画同步”问题。性能
在PC上,录制方案分2类:测试
在游戏中,把游戏PC机音视频流导出后,经过硬件采集卡+相关工具进行录制,流程以下:.net
PC上软件录制工具不少,本案使用:ffmpeg + “screen capture” directshow filtercode
安装dshow filter: Screen Capturer Recorder视频
录制:ffmpeg -f dshow -framerate 30 -i video="screen-capture-recorder" -c:v h264 -r 30 -f dshow -i audio="virtual-audio-capturer" -b:a 192k -ar 44100 -ac 2 -t 5 out.mp4
游戏
在音画同步测试中,画质损失对于帧特征识别影响不大,但丢帧/不能满帧录制则会引入偏差,好比:
上图中,音频起始时间:time1,特征首帧时间:frame2(time1),不能满帧录制致使frame2丢帧,特征首帧时间变为:frame3(time2),引入偏差:∆t' = time2 - time1,60fps游戏使用30fps录制,则可能引入偏差 ∆t' = 0.016s。
(注:上文中,特征含义:当音频出现时,在画面中应该出现的图像特征,好比:射击时,画面出现的枪体震动...)
偏差对测试的影响,将在下文讨论。
流程核心步骤:帧特征识别 与 音频特征识别。
这里,咱们把“帧特征识别”问题转化为:在图像中寻找子图像(特征)。
问题转换后,解决方案就很明确了,可使用opencv提供模板匹配处理,部分源码以下:
... feature = cv2.imread(feature_path, 0) for frame_path in frame_paths: frame_rgb = cv2.imread(frame_path) frame_gray = cv2.cvtColor(frame_rgb, cv2.COLOR_BGR2GRAY) res = cv2.matchTemplate(frame_gray, feature, cv2.TM_CCOEFF_NORMED) loc = numpy.where(res >= threshold) if len(list(zip(*loc[::-1]))) > 0: index = get_frame_index(frame_path) T1 = index / framerate break ...
这里,咱们把“帧特征识别”问题转化为:在长音频(视频音频)中寻找子音频(特征音频),这里使用“互相关”函数处理。
须要注意的“坑”:
... src_data, s_framerate = read_wav(feature_path) deg_data, d_framerate = read_wav(audio_path) if s_framerate != d_framerate: return n = max(len(src_data), len(deg_data)) result = numpy.correlate(src_data, deg_data, mode='full') m = result.max().item() m_indexs, = numpy.where(result == m) m_index = m_indexs[0] offset = m_index - n + 1 if offset < 0: offset = -offset T2 = offset / s_framerate ...
在这部分,咱们要讨论一个问题:玩家对FPS游戏音画不一样步的感知力到底如何?探讨这个问题,可让咱们订立一个针对FPS游戏的音画同步标准。
关于音画同步,业界有3个标准:
其中,影响力最大的是ITU-R BT.1359,下面将重点对ITU-R BT.1359进行分析。
《ITU-R BT.1359-1》是国际电信联盟于1998年修订,针对电视广播的音画同步标准,该标准至今仍被使用,同时应用范围也扩展到互联网直播领域。
其中,负值表示:画前音后;正值表示:画后音前;
上图是电视广播简化版处理链路,每一个节点都可能引入同步差。其中:
分值 | 含义 |
---|---|
5 | 彻底不可察觉 |
4 | 可察觉,但不讨厌 |
3 | 稍微讨厌 |
2 | 讨厌 |
1 | 彻底没法接受 |
FPS游戏音画场景不少,如:脚步声,敌方开枪,玩家开枪......
但玩家对不一样场景的感知力并不相同,由于玩家关注点可能并不在上面:
因此,如下评测FPS游戏音画同步性采用:“玩家开枪”场景;
与评测流程相比,真实交互流程是少了1次△ta2的延迟。
与ITU评测方案差别分析:
音画同步差△t的范围(ms) | 认为“同步”的占比 |
---|---|
-400 ~ -450 | 23% |
-300 ~ -350 | 48% |
-200 ~ -250 | 80% |
-100 ~ -150 | 90% |
-30 ~ 30 | 95% |
100 ~ 150 | 75% |
200 ~ 250 | 47% |
300 ~ 350 | 19% |
400 ~ 450 | 7% |
500 ~ 550 | 2% |
(注:音画同步差△t的范围 表示 步骤1~7音画差总和的范围)