OpenCV中视频播放速度为何与FPS数值相关?
为什么设置60 FPS后视频播放速度大幅变快?
你刚好搞反了FPS的核心作用哦!FPS(Frames Per Second,每秒帧数)不是用来控制视频“播放速度快慢”的开关,它的本质是告诉视频播放器:这个视频应该以每秒X帧的速率来渲染画面。视频的实际播放时长,其实是由「总帧数 ÷ 设置的FPS值」决定的。
拆解你的场景问题
假设你实际从屏幕上捕获了60帧画面(比如你原本想录10秒的屏幕,但你的捕获逻辑每秒只抓取6帧,10秒下来刚好60帧):
- 如果你把
VideoWriter的FPS设为6,播放器就会每秒播放6帧,60帧刚好能播10秒,和你预期的录制时长一致; - 但你设成了60,播放器就会每秒刷完60帧,60帧1秒就播完了,自然会觉得“视频速度变快了”。
OpenCV VideoWriter的FPS参数到底是什么?
这个参数是写入视频文件的元数据——它不会干预你捕获屏幕的帧数量,只是给播放器一个播放节奏的标准。打个比方:你拍了60张照片,告诉别人“每秒看60张”,那1秒就看完了;如果说“每秒看6张”,就能看10秒。照片总数没变,只是观看的节奏变了。
怎么解决这个问题?
- 先统计实际捕获帧率:在捕获屏幕的代码里加个计时统计,看看你每秒实际能抓到多少帧(比如用
cv2.getTickCount()来计算时间差); - 匹配FPS参数:把
VideoWriter的FPS设置成和你实际捕获帧率一致的数值,这样视频播放时长就会和你实际录制的时长完全匹配; - 按需调整快慢放:如果想刻意慢放或快放,再调整FPS:比如你捕获了60帧(实际10秒,6FPS),想慢放成20秒,就把FPS设为3;想快放成5秒,就设为12。
举个简单的代码示例(修正FPS匹配的问题):
import cv2 import numpy as np from mss import mss monitor = {"top": 0, "left": 0, "width": 1920, "height": 1080} sct = mss() fourcc = cv2.VideoWriter_fourcc(*'XVID') # 先捕获少量帧,统计实际帧率 test_frame_count = 10 start_time = cv2.getTickCount() for _ in range(test_frame_count): sct.grab(monitor) end_time = cv2.getTickCount() actual_fps = test_frame_count / ((end_time - start_time) / cv2.getTickFrequency()) print(f"实际捕获帧率:{actual_fps:.2f} FPS") # 用实际捕获的FPS来初始化VideoWriter out = cv2.VideoWriter('output.avi', fourcc, actual_fps, (1920, 1080)) # 开始正式捕获 frame_count = 0 total_records_seconds = 10 target_frames = int(actual_fps * total_records_seconds) while frame_count < target_frames: img = sct.grab(monitor) frame = np.array(img) frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) out.write(frame) frame_count += 1 out.release()
这样生成的视频,播放时长就会和你设置的total_records_seconds(10秒)一致啦。
内容的提问来源于stack exchange,提问作者Little Max
相关产品推荐
相关产品推荐

