因此,请澄清一下,我对C ++还是陌生的,所以如果这个问题很微不足道,我先向您道歉,但我确实确实试图找到一种方法来实现此目的,我想我只是在使用错误的术语。
我想做的是使用一些过程来更改位图图像的内容(尺寸和其他所有内容保持不变)。当我运行一个流程以对其进行转换时,我想在图像发生时将其同时流式传输到屏幕上。因此,基本上,它是没有一系列图像的视频,而是在转换的不同阶段具有相同图像。我要这样做是因为我要使用的位图很大,因此由于内存限制,实际上无法将每个状态另存为自己的图像,然后进行合并。
我的问题是关于“实时图像显示”,而另一个过程正在修改图像,是否可以用位图图像完成类似的事情?
您可以直接在视频编码器中流式传输图像。
例如,您可以使用原始PGM / PPM图像作为输入来输入ffmpeg
,而无需在磁盘上创建实际图像,就可以将压缩视频作为输出。
编写PGM或PPM图像意味着只生成几个头字节,后跟实际的像素值,因此,无需任何图像库,对任何语言而言都是微不足道的。例如:
ffmpeg
在标准输出上生成可以直接在视频中组合的图像序列。使用
运行程序#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;
}
将以60fps的速度生成名为./video | ffmpeg -i - -r 60 -format pgm -y out.mp4
的视频(out.mp4
代表什么),并从标准输入(选项-r
)接受PGM格式(-format pgm
)作为源图像,并覆盖已存在的输出文件( -i -
)。
此代码已在linux上进行了测试;为了使这种方法在Windows上工作,您还需要将-y
设置为更多与stdout
或类似的二进制文件(我没有在Windows上进行测试)。
一种基本相同的更复杂的方法是启动子进程,而不是使用管道,从而使程序可以使用标准输出。