MPEG 2-D 数据文件压缩
在我的研究过程中,我必须处理由各种 2-D 计算机模拟产生的数十 GB 数据。通常,这些数据来自矩形网格,并以原始字节格式存储在文件中,作为连续时间步的“帧”序列。每个帧代表一个 2-D 数组,可以通过在计算机屏幕上将其值显示为像素强度来可视化。然后,整个数据文件可以被视为电影。原始数据格式的电影文件存在两个实际问题。
首先,我不知道有任何免费或开源的播放器可以播放这种格式。商业播放器适用于有限数量的平台,但通常它们具有太多不必要的功能且价格昂贵。我为 Linux 编写了自己的基于 Mesa 3-D 的简单播放器,但它速度很慢,并且与在其他平台上工作的人共享我的数据文件是一次痛苦的经历。
第二个问题是我的电影文件体积巨大。每次我想存储它们或通过互联网发送给我的同事时,我都必须使用 gzip 压缩文件,然后在每次我想播放它们时都必须解压缩它们。
我通过将我的数据文件转换为 MPEG 视频格式,解决了可移植性和压缩问题。我花了一段时间才弄清楚如何使用 Linux 的免费开源工具来做到这一点,现在我很高兴与您分享。
第一步是安装 Mjpegtools,这是一个包含 MPEG 编码器的软件包。虽然 rpmfind.net 上提供了一些版本,但我直接从 mjpeg.sourceforge.net 下载了 mjpegtools-1.6.0 的最新源代码,它是一个 gzip 压缩的 tarball 文件(约 1MB)。然后我在我的 Red Hat 6.2 Pentium 机器上执行了 tar -xzvf mjpegtools-1.6.0.tar.gz; cd mjpegtools-1.6.0,但我应该首先阅读 INSTALL 文件中的先决条件。我最初忽略了它们,继续执行了 ./configure 和 make,这导致编译成功,但在运行时导致崩溃。我不得不返回,从 rpmfind 安装汇编器软件包 nasm-0.98-2m,然后重新执行 ./configure 和 make。
Mjpegtools 无法直接接受我的原始数据文件,但它可以接受类似的格式,即 PPM(Portable Pixel Map)流。PPM 是一种静态图像格式,它由一个简单的标头和一系列原始字节组成,这些原始字节编码图像中每个像素的红色、绿色和蓝色分量。它是可用的最简单的彩色图像格式之一(有关详细信息,请参阅 ppm 手册页或 netpbm.sourceforge.net/doc/ppm.html)。当几个 PPM 图像文件的内容一个接一个地放置而没有任何特殊分隔符时,就会获得 PPM 流。我编写了一个简单的 C++ 程序 sim2ppm,它将我的原始电影文件转换为 PPM 流并将其发送到标准输出。Sim2ppm 在每个帧的开头添加一个合适的 PPM 标头,并根据我选择的颜色映射,将每个数据字节拆分为三个颜色分量字节。
假设我的原始 2-D 模拟数据文件 movie.sim 和我的 sim2ppm 二进制文件位于当前目录 mjpegtools-1.6.0/ 中,以下是我将其转换为 MPEG 格式的方法
sim2ppm movie.sim | lavtools/ppmtoy4m | mpeg2enc/mpeg2enc -F 2 -q 10 -a 1 -o movie.mpg
ppmtoy4m 过滤器将 PPM 流转换为 YUV 流,这是 mpeg2enc(实际的 MPEG 编码器)所需的输入格式。有关命令行选项的说明,请参阅发行版附带的 mpeg2enc 手册页。此命令生成一个压缩的 MPEG 文件 movie.mpg。
生成的文件可以使用任何 MPEG 播放器播放。根据压缩程度和数据类型,我通常会获得质量良好的电影,这些电影的大小比原始原始文件小 200 多倍,即,一个 GB 的原始数据可能会缩小到只有几 MB。这样的 MPEG 文件可以放在 Web 上以便快速下载。它可以直接从大多数操作系统上的大多数浏览器播放。
Linux 上有两个流行的免费 MPEG 播放器:mpeg_play 和 xanim。它们可能已经包含在您的 Linux 发行版中,或者可以在 rpmfind.net 上找到。Xanim 可以播放各种视频格式,但它会跳过某些 MPEG 帧(仅显示 I 帧)。这就是为什么我使用 mpeg_play 来查看我的电影文件。例如,输入 mpeg_play -framerate 5 movie.mpg & 将以每秒五帧的速率播放我们的电影。
RPMfind,一个大型 Linux 软件包在线数据库。
Roman Zaritski 是新泽西州蒙特克莱尔州立大学的计算机科学助理教授。他的兴趣包括数值建模和集群计算。