高质量DOSBox视频捕获

2020-10-25 03:11:32

偶尔,出于怀旧的缘故,我会在DOSBox中启动一款老式的DOS游戏或语言翻译器。我已经在github.com/susam/uditment上存档了这些陈年计划。

.DOSBox是一个模拟运行DOS的IBM PC兼容计算机的模拟器程序。尝试这些过时的DOS程序现在唤起了我童年时代的记忆,当时我第一次接触到计算机,那是我们小学课程的一部分。在那些日子里,计算机要简单得多。我们学校的是IBM PC兼容机,大部分是单色显示器。其中几个支持由CGA或EGA显卡提供的非常有限的颜色。使用装有MS-DOS的5/4英寸软盘启动计算机,从另一张软盘加载徽标或BASIC解释器,或从另一张软盘加载计算机游戏,然后不受任何干扰地编写程序或玩几个游戏,这种能力有其自身的魅力,我发现这是现代计算机所缺少的。

在这个时代,在使用旧的DOS程序和DOSBox时,我经常想截取DOSBox会话的屏幕截图或视频截图,并与我的朋友分享。在本文中,我将解释如何以我可以与他人共享的格式创建高质量的DOSBox会话屏幕截图和视频截图。

由于本文涉及多个软件,因此如果这些软件工具中的任何一个的行为在将来发生变化,这里所写的一些内容在将来可能不适用。下面的列表包含用于测试本文中提供的命令的所有软件工具的版本:

请注意,上面列表中的Logo和Digger程序都是1983年发布的OS程序。它们不能直接在现代计算机上运行,但可以在DOSbox上运行,因为它模拟了旧的IBM PC兼容计算机。

IBM Personal Computer Logo由Logo Computer Systems Inc.(LCSI)于1983年开发,是我小时候学习计算机时接触到的第一款软件。我8岁的时候在4班遇到它,我们学校有一张5/4英寸的软盘,上面有IBM PCLogo。因此,Logo是我一生中学到的第一种编程语言。大约20年后,我意识到我学习的第一种编程语言是Lisp方言。真是太棒了!

如果当前目录中存在徽标解释程序LOGO.COM,则可以使用以下命令与DOSBox一起运行:

我喜欢用Logo画的一件事是一个重叠的圆圈网格,如下所示:

大约在我学习Logo的同时,我还偶然看到了1983年风车软件公司为IBMPC开发的一款电脑游戏“挖掘者”(Digger)。

如果目录中存在Digger程序DIGGER.COM,则可以使用DOSBox和以下命令运行该程序:

MACHINE CGA选项模拟安装了ColorGraphics Adapter(CGA)的计算机,因为Digger需要正确的TORUN类型的计算机。配置选项Cycle=500会降低DOSBox模拟指令的速度,以便模拟过去速度较慢的机器。在没有这个选项的情况下,Digger运行得很快,这样就可以方便地玩了。

挖掘者有一个很棒的游戏,玩家在地下隧道挖洞捡祖母绿,丢下金袋释放黄金或挤压诺宾和霍宾,收集释放的黄金到恩莫尔点,等等。它使用鲜艳诱人的颜色。这音乐很棒。1983年“挖掘者”上映时,它在当时是相当先进的。

上面的屏幕截图是通过在DOSbox上运行IBM PC Logo和1983年最初的PC Boot版Digger获得的,然后调整屏幕截图的大小,使其宽高比与折叠CRT计算机显示器的宽高比相匹配。

要获取屏幕截图,我们首先在DOSBox运行时按Ctrl+F5。屏幕截图的路径出现在启动DOSBox的终端的控制台输出中。例如:

以这种方式获得的屏幕截图的纵横比为8:5,这使得输出看起来是水平拉伸的。为其编写这些旧DOS程序的旧CRT计算机监视器的宽高比为4:3。这种拉伸的外观可以通过将图像大小调整为4:3来修复。以下是用于固定长宽比并生成图像的命令:

我们在这里使用-sample选项来调整图像大小,而不是使用-resize或-scale。-RESIZE或-SCALE选项将通过引入其他颜色来平滑文本和图形中的锯齿状边缘。-resize选项对于现实世界的图像非常有用,我们确实希望在放大或缩小时边缘平滑,但在这些屏幕截图中,我们希望保留DOSBox和老式CRT显示器典型的清晰和锯齿状的边缘。因此,我们使用不引入任何新颜色的-sample选项。相反,它使用最近邻内插(点采样)来决定缩放图像的颜色。

那!标志用于忽略原始图像的纵横比。如果没有此标志,输出文件的大小将为1920x1200,也就是说,长宽比为8:5的最大大小适合1920x1440框。使用此标志时,8:5的原始纵横比将被忽略,并且输出大小正好为1920x1440。

顺便说一句,我已经根据知识共享署名4.0国际(CC by 4.0)许可证将上面的图片捐赠给了维基媒体共享网站(Wikimedia Commons):

将图片放在Wikimedia Commons上有助于将这些屏幕截图包含在徽标上的维基百科文章中。

还有挖掘者。要开始捕获DOSBox的视频,请按Ctrl+Alt+F5。相同的组合键可以停止捕获视频。控制台输出中将显示以下输出,以显示视频文件的保存位置:

比方说,我想与可能在不支持播放AVI文件的设备上的朋友分享在上面运行Logo的DOSBox的视频截图。以下FFmpeg命令将视频转换为可以广泛分发并在各种设备和播放器上播放的格式:

Ffmpeg-i徽标_000.avi-an-c:v libx264-预设非常慢\-crf 17-vf格式=yuv420p,比例=1920:1440:标志=邻居,fps=30\DOSBOX-logo.mp4。

此视频中的音频是静音的,因此我们通过使用此选项禁用音频流来稍微减小文件大小。例如,不使用此选项时,输出文件大小为317 KB,但使用此选项时,输出文件大小为282 KB。

如果音频流需要保留(例如,对于具有音频的DOS游戏),则不应指定此选项。我们将在下一节中看到这方面的示例。

此选项选择X264编码器将视频流编码为H.264格式。H.264也称为MPEG-4第10部分,高级视频编码(MPEG-4AVC)。目前,它是记录、压缩和分发视频内容的最流行格式。

此选项提供视觉无损输出,即人眼可以感知的高质量输出而没有任何质量损失。为了实现完全无损输出,我们需要使用-crf 0选项。但是,此选项会将视频配置文件设置为高4:4:4预测,这会阻止视频在某些视频播放器中播放。这个问题将在本列表后面介绍的yuv420p像素格式中进行更详细的讨论。由于此问题不能使用-crf 0,因此次佳选项是-crf 1,虽然它不是完全无损的,但比视觉无损要好得多。由于它以质量换取输出大小,因此输出文件的大小为319KB。-crf 51选项生成损耗最大的输出,即文件大小为159 KB的质量最差的输出。

此选项以编码速度为代价提供更好的压缩。例如,如果没有此选项,它在我的系统上大约在16秒内生成大小为355KB的输出,但是如果使用此选项,它在同一系统上将在大约31秒内生成大小为282KB的输出。

此视频过滤器选项可确保输出视频文件可以在各种设备和播放器中运行。

例如,如果没有此视频过滤器选项,我们将获得YUV4:4:4平面格式的输出。我发现MacOS High Sierra和Android 9.0.0上的QuickTime Player版本10.4无法播放这种格式。

$ffmpeg-v Quiet-i徽标_000.avi-an-c:v libx264 DOSBOX-徽标.mp4$ffprobe-v error-show_entry stream=编解码器名称,配置文件,pix_fmt dosbox-logo.mp4[STREAM]codec_name=h264profile=High 4:4:4预测epix_fmt=yuv444p[/STREAM]。

使用此视频过滤器选项,我们可以获得YUV4:2:0平面格式的输出。现在QuickTime播放器版本10.4和Android 9.0.0都可以播放这种格式。

$ffmpeg-v Quiet-I徽标_000.avi-an-c:v libx264-vf格式=yuv420p DOSBOX-徽标.mp4$ffprobe-v错误-显示条目流=编解码器名称,配置文件,pix_fmt dosbox-logo.mp4[STREAM]codec_name=h264profile=Highpix_fmt=yuv420p[/STREAM]

为了最大限度地兼容非常旧或过时的设备,我们可以添加-profile:v Baseline选项,将视频配置文件设置为受限基线。除非我们确实需要支持旧的或过时的设备,否则不建议使用此选项。我们还需要记住,基线配置文件不支持使用-crf 0选项的无损编码。对于此配置文件,我们可以指定的损失最小的编码选项是-CRF1,虽然在技术上不是无损的,但它比视觉无损要好得多。

$ffmpeg-v Quiet-I徽标_000.avi-an-c:v libx264-vf格式=yuv420p-配置文件:v基线DOSBOX-徽标.mp4$ffprobe-v错误-显示条目流=编解码器名称,配置文件,pix_fmt dosbox-logo.mp4[STREAM]codec_name=h264profile=Constrained Baselinepix_fmt=yuv420p[/STREAM]。

使用此视频过滤器选项,我们调整视频大小以保持4:3的纵横比,即旧CRT计算机显示器的纵横比,以便输出看起来与过去在这些显示器上的外观相似。

邻居标志确保使用最近邻内插(点采样)来决定缩放图像的颜色。如果没有此选项,将使用默认的双三次插值算法。它的效果是通过引入新的颜色来平滑边缘,比如这个示例视频的新的灰色阴影。虽然这种边缘平滑对缩放真实世界的图片很有好处,但在这种情况下,它会破坏DOSBox或老式CRT显示器中可见的典型输出的清晰和锯齿状的边缘。使用邻居选项,我们可以保留原始视频捕获中可见的清晰和锯齿状边缘。

此视频过滤器选项将帧速率设置为每秒30帧(FPS)。如果没有此选项,输出视频的帧率为70.09 FPS,文件大小为558KB。使用此选项时,输出帧率为30 FPS,文件大小为282 KB。

DOSBox v0.74-3的机器配置变量的默认值为SVGA_S3,因此默认情况下它会模拟使用SVGA卡的机器。在模拟使用SVGA卡的机器时,DOSBox创建帧率为70.09 FPS的视频捕获文件。当它模拟带有CGA卡的机器时,例如,当ITS机器配置变量设置为CGA时,或者当DOSBox使用-MACHINE CGA选项运行时,它会创建帧率为59.92 FPS的视频捕获文件。

对于Logo视频捕获,视频中没有进行高速运动,因此我们不需要高帧率。30帧/秒的较低帧频看起来也一样好。

挖掘者游戏的视频捕获是类似的处理,但是,有一些额外的事情我们需要照顾。我们希望在输出文件中包含游戏音频。我们还想要更高的帧率,因为游戏有时可能会有高速运动。

和以前一样,我们使用Ctrl+Alt+F5开始捕获视频。相同的组合键可以停止捕获视频。控制台输出中将显示以下输出,以显示视频文件的保存位置:

Ffmpeg-i digger_000.avi-c:a aac-b:a 256k-c:v libx264-预置非常慢\-crf 17-vf格式=yuv420p,scale=1920:1440:flag=Neighbor,fps=50\DOSBOX-digger.mp4。

上面命令中使用的大多数FFmpeg选项已经在上一节中讨论过。让我们讨论一下这里使用的新选项,这些选项在前面没有讨论过:

此选项选择本地FFmpeg AAC编码器将音频流编码为高级音频编码(AAC)格式。对于MP4文件中的音频流,它是一种非常流行的格式。

这会将音频比特率设置得足够高,以确保我们在输出中获得高质量的音频。我们不需要担心我们指定的比特率太高。如果音频可以在不影响质量的情况下以较低的比特率编码,则输出音频流以较低的比特率编码。例如,对于此特定视频,输出文件中的实际音频比特率为245k,因为这足以对输入文件中的音频流进行编码。

如果我们像上一节那样将帧速率设置为一个较低的值(如30FPS),我们仍然可以获得相当好的输出,但是,输出视频的某些部分看起来有点起伏。例如,在视频进入7秒时,当播放器向上推向金包时,如果我们生成帧率为30 FPS的输出,则视频会变得略有起伏。较高的帧速率(如50 FPS)可避免此问题。

如果完全省略此选项,则输出视频的帧率与输入视频相同,即59.92 FPS,输出文件大小为4.6MB。使用此选项,我们可以获得帧率为50FPS、文件大小为4.2MB的输出视频。

如果我们足够仔细地查看上面的输出视频,我们会发现颜色看起来并不像“挖掘者”游戏截图中那样鲜艳

。邻居标志在保持Logo视频捕获中的清晰和锯齿状边缘方面非常有效,但是对于本节中的Digger视频捕获来说,它并不能产生完美的结果。尽管存在缺陷,但仍有必要指定邻居选项,因为如果没有此选项,输出的视频看起来会更差。我们可以使用不同的像素格式,如yuv444p,而不是yuv420p来解决此问题。使用yuv444p格式确实会产生完美的最近邻内插,这有助于准确地保留视频中清晰和锯齿状的边缘,但正如上一节所解释的那样,许多媒体播放器目前不能播放这种像素格式,因此我们在本文中坚持使用yuv420p格式。现在只是为了好玩,让我们看看是否可以将视频截图转换成GIF动画。使用FFmpeg可以很容易地做到这一点。以下是将Logo视频捕获转换为GIF动画的常用方法:

Ffmpeg-I LOGO_000.avi-VF Palettegen Palette.pngffmpeg-I LOGO_000.avi-i Palette.png\-ramfi';scale=1920:1440:flag=Neighbor,Paletteuse,fps=30';\DOSBOX-logo.gif。

第一个命令从视频捕获生成调色板。第二个命令使用这个调色板来生成GIF动画。和前面一样,我们使用邻居标志来保留清晰和锯齿状的边缘。以下是输出:

Ffmpeg-i digger_000.avi-vf Palettegen Palette.pngffmpeg-i digger_000.avi-i Palette.png\-latfi';scale=1920:1440:flag=Neighbor,Paletteuse,fps=50';\DOSBOX-digger.gif。

以下是一些参考资料,其中包含有关本文中使用的命令的更多详细信息: