在C ++中修改位图时流式传输

问题描述 投票:0回答:1

因此,请澄清一下,我对C ++还是陌生的,所以如果这个问题很微不足道,我先向您道歉,但我确实确实试图找到一种方法来实现此目的,我想我只是在使用错误的术语。

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

我的问题是关于“实时图像显示”,而另一个过程正在修改图像,是否可以用位图图像完成类似的事情?

c++ graphics sdl sdl-2
1个回答
0
投票

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

例如,您可以使用原始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上进行测试)。

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

© www.soinside.com 2019 - 2024. All rights reserved.