在遊戲測試中,音畫同步測試是個難點(所謂遊戲音畫同步:遊戲中,音效與畫面的同步程度),如今通常採用人工主觀判斷的方式測試,但這會帶來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音畫差總和的範圍)