将屏幕截图捕获为图像然后使用 ffmpeg 将图像转换为视频文件的时间应该是啥?

Posted

技术标签:

【中文标题】将屏幕截图捕获为图像然后使用 ffmpeg 将图像转换为视频文件的时间应该是啥?【英文标题】:What should be the timing to capture screenshots as images and then convert the images to video file using ffmpeg?将屏幕截图捕获为图像然后使用 ffmpeg 将图像转换为视频文件的时间应该是什么? 【发布时间】:2016-07-22 11:33:39 【问题描述】:

我有一个计时器滴答事件,我每 10 毫秒截屏一次

        int count = 0;
        private void timer1_Tick(object sender, EventArgs e)
        
            Bitmap bmp = new Bitmap(sc.CaptureScreen());
            bmp.Save(@"D:\SavedScreenshots\screenshot" + count + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
            bmp.Dispose();
            count ++;
        

然后我在命令提示符窗口中使用 ffmpeg 命令行从所有图像创建视频文件:

ffmpeg -framerate 2 -i screenshot%d.bmp -c:v libx264 -r 30  -pix_fmt yuv420p out.mp4

硬盘上的每个位图文件大小为 7.91 MB 细节:1920x 1080 位深 32

问题是当使用 -framerate 2 制作 ffmpeg 命令行时,当我在 windows 媒体播放器中播放视频文件时,速度非常慢。 当我将帧速率设置为 10 时,它太快了。 当我将帧速率设置为 4 时,我收到黄色错误表示太大。

但也许问题是我每 10 毫秒截屏一次?也许我应该每 1000 毫秒截屏一次?然后我应该在 ffmpeg 命令行中更改什么?

我希望它像普通的视频文件速度一样。不太快也不太慢。 我在屏幕截图中捕获的是我的桌面屏幕,稍后我想将其上传并显示给论坛中的一些支持帮助。

【问题讨论】:

YouTube 中的常规视频速度约为 24fps 或 30fps。这意味着 24 或 30 个位图在 1 秒内。您的计时器必须是 1000/24 或 1000/30 毫秒。我认为在 ffmpeg 中,-framerate 1/24 或 1/30 【参考方案1】:

您可以直接捕获,使用 FFmpeg。

ffmpeg -f gdigrab -framerate 24 -i desktop -preset ultrafast -pix_fmt yuv420p out.mp4

(按 Ctrl-C 或 q 停止)。

您可以调整捕获文件的大小,

ffmpeg -i out.mp4 out-small.mp4

如果您想继续使用 C#,请使用 1000/24 毫秒的计时器间隔和

ffmpeg -framerate 24 -i screenshot%d.bmp -c:v libx264 -pix_fmt yuv420p out.mp4

【讨论】:

以上是关于将屏幕截图捕获为图像然后使用 ffmpeg 将图像转换为视频文件的时间应该是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用多个 CALayers 捕获 UIVIew 的屏幕截图显示白色背景,同时将图像保存在图库中

安卓屏幕截图

csharp 使用FFMPEG截取屏幕截图并从视频生成图像

如何捕获画布的屏幕截图 [重复]

如何将iphone屏幕截图保存为jpeg图像?

如何使用 C# .Net 将屏幕捕获为视频?