您可以直接在视频编码器中流式传输图像。
例如,您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
在标准输出上生成可以直接组合在视频中的图像序列。运行程序
./video | ffmpeg -i - -r 60 -format pgm -y out.mp4
Run Code Online (Sandbox Code Playgroud)
将生成一个名为 的视频out.mp4。视频将以 60fps(实际用途)从标准输入(选项)-r的 PGM 格式 ( ) 源图像创建,并覆盖输出文件(如果已存在) ( )。-format pgm-i --y
这段代码在linux上测试过;为了使这种方法在 Windows 上工作,您还需要将其设置stdout为二进制 more_setmode(fileno(stdout), _O_BINARY);或类似的东西(我没有在 Windows 上进行测试)。
实现基本相同的更复杂的方法是启动子进程而不是使用管道,从而使程序可以使用标准输出。
| 归档时间: |
|
| 查看次数: |
397 次 |
| 最近记录: |