【问题标题】:streaming a bitmap while it is modified in C++在 C++ 中修改位图时流式传输
【发布时间】:2020-06-01 07:54:09
【问题描述】:

我想要做的是使用一些过程来改变位图图像的内容(尺寸和其他一切都保持不变)。当我运行一个进程对其执行转换时,我想同时将图像流式传输到我的屏幕上。所以它基本上是没有一系列图像的视频,而是转换不同阶段的相同图像。 我正在尝试这样做,因为我要使用的位图很大,因此由于内存限制,实际上将每个状态保存为自己的图像然后组合是不可能的。

我的问题是关于“实时图像显示”,而另一个进程修改图像,有什么办法可以用位图图像完成类似的事情吗?

【问题讨论】:

    标签: c++ graphics sdl sdl-2


    【解决方案1】:

    您可以直接在视频编码器中流式传输图像。

    例如,您可以向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 上测试)。

    实现基本相同的更复杂的方法是启动子进程而不是使用管道,从而使程序可以使用标准输出。

    【讨论】:

      【解决方案2】:

      如果您只是想实时查看结果,可以使用类似于翻页/双缓冲的方法。

      基本上:创建两个图像。图像 1 是“绘图缓冲区”,而图像 2 是“显示缓冲区”。对图像 1 执行绘图的某些部分。然后,将其完整内容复制到图像 2。继续对图像 1 进行绘图,复制、绘制、复制、绘制……等等。在每个复制之前插入一个延迟。

      【讨论】:

        猜你喜欢
        • 2016-08-08
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        相关资源
        最近更新 更多