使用C# VideoFileWriter录屏速度过快,如何调整为正常速度?
解决录屏播放速度过快的问题
嘿,这个播放过快的坑我之前踩过!核心原因就是你设置的输出帧率和实际录制时每秒捕获的帧数没对上,或者没控制好帧的时间间隔。先看看你当前的代码:
recorder.Open(pathFolder+GetCurrentDateAndTime() + ".mp4", Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenWidth), Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenHeight), 10, // 这里的输出帧率是关键问题点 VideoCodec.MPEG4, 2000000);
下面是具体的修改方向,按优先级来:
1. 先把输出帧率改成标准值
你现在设的10fps太低了,日常视频的标准帧率是24、25(PAL制式)或者30(NTSC制式)fps。如果实际录制时每秒抓的帧数远多于10,播放器按10fps播放时就会快速跳帧,自然就快了。
直接把帧率改成25或者30试试:
recorder.Open(pathFolder+GetCurrentDateAndTime() + ".mp4", Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenWidth), Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenHeight), 25, // 换成25或30,根据你的需求选 VideoCodec.MPEG4, 2000000);
2. 确保录制时的帧捕获间隔和帧率匹配
改完帧率后,得保证每秒捕获的帧数和这个值一致。比如设25fps的话,每帧之间的间隔就得是40毫秒(1000/25)。如果你的录制是循环抓屏,记得控制循环的间隔:
int frameGap = 1000 / 25; // 对应25fps的间隔 while (isRecording) { // 你的屏幕捕获代码,比如抓当前屏幕成Bitmap Bitmap screenFrame = CaptureCurrentScreen(); recorder.WriteVideoFrame(screenFrame); // 控制间隔,保证每秒刚好抓25帧 Thread.Sleep(frameGap); }
这里要注意:如果抓屏本身耗时比较久,可能得调整Sleep的时间,比如用Stopwatch计算抓屏耗时,再动态调整Sleep时长,避免累积误差。
3. 用带时间戳的写帧方法(进阶方案)
如果抓屏耗时不稳定,没办法精确控制间隔,那可以用WriteVideoFrame的带时间戳重载,告诉视频文件每帧的实际时间点,播放器就会按真实时间播放,不会乱速:
Stopwatch timer = Stopwatch.StartNew(); while (isRecording) { Bitmap screenFrame = CaptureCurrentScreen(); // 传入当前时间戳(注意单位是微秒,这个是多数视频库的要求) recorder.WriteVideoFrame(screenFrame, timer.Elapsed.TotalMilliseconds * 1000); // 加个短Sleep避免CPU跑满 Thread.Sleep(1); }
4. 比特率的小检查(非核心)
你当前设的2000000(2Mbps)对1080P屏幕来说是合理的,但如果是4K屏可能得调到5-10Mbps。不过这个主要影响画质,不是速度问题的核心,但如果前面的方法都试过还不行,可以排查下这个。
总结下:先改帧率到25/30,再匹配抓屏间隔,基本就能解决播放过快的问题了!
内容的提问来源于stack exchange,提问作者עמית בן צור
相关产品推荐
相关产品推荐

