您可以直接在视频编码器中流式传输图像。
例如,您可以向ffmpeg 提供原始 PGM/PPM 图像作为输入,您将获得压缩视频作为输出,而无需在磁盘上创建实际图像。
编写 PGM 或 PPM 图像意味着只生成几个标头字节,然后是实际像素值,因此无需任何图像库即可使用任何语言进行操作。例如:
#include <stdio.h>
#include <math.h>
#include <algorithm>
int main(int argc, const char *argv[]) {
int w = 1920, h = 1080;
for (int frame=0; frame<100; frame++) {
// output frame header
printf("P5\n%i %i 255\n", w, h);
for (int y=0; y<h; y++) {
for (int x=0; x<w; x++) {
double dx = (x - w/2),
dy = (y - h/2),
d = sqrt(dx*dx + dy*dy),
a = atan2(dy, dx) - frame*2*3.14159265359/100,
value = 127 + 127*sin(a+d/10);
// output pixel
putchar(std::max(0, std::min(255, int(value))));
}
}
}
return 0;
}
在标准输出上生成可以直接组合成视频的图像序列。运行程序
./video | ffmpeg -i - -r 60 -format pgm -y out.mp4
将生成一个名为 out.mp4 的视频。视频将以 60fps(-r 的用途)从标准输入(选项-i -)的 PGM 格式(-format pgm)的源图像创建,如果它已经存在(-y)覆盖输出文件。
这段代码在linux上测试过;对于这种在 Windows 上工作的方法,您还需要使用 _setmode(fileno(stdout), _O_BINARY); 或类似的东西将stdout 设置为二进制更多(我没有在 Windows 上测试)。
实现基本相同的更复杂的方法是启动子进程而不是使用管道,从而使程序可以使用标准输出。