首页 > 解决方案 > 使用两个纹理 SDL2 显示视频

问题描述

我需要构建一个界面,屏幕左侧显示一个流视频的一部分,右侧显示另一部分。像这样的https://www.youtube.com/watch?v=fSPXpdVzamo

视频流保存在正在加载到纹理上的内存缓冲区中。我的问题是如何只渲染纹理的一半,我一直在尝试使用 SDL_Rect 但没有任何反应。

这是我的代码的相关部分:

SDL_UpdateTexture(texture, NULL, buffer_start, fmt.fmt.pix.width * 2);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);

如果我尝试这样的事情,它不起作用:

SDL_UpdateTexture(texture, NULL, buffer_start, fmt.fmt.pix.width * 2);

SDL_Rect someRect;
someRect.x = 0;
someRect.y = 0;
someRect.w = 1500;
someRect.h = 3000;

SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, &someRect);
SDL_RenderPresent(renderer);

任何建议都会很棒!

标签: c++sdl-2

解决方案


如果没有您发布 MCVE,很难知道您哪里出错了。我的猜测是你的 x 位置是错误的。这是一个示例,我展示了如何以视频的方式绘制 2 张图像。

绿色图片:https ://i.imgur.com/yaOG8Ng.png

红色图片: https ://i.imgur.com/faKKShU.png

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>

#define HEIGHT 600
#define WIDTH  800

using namespace std;

int main() {
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window *window = SDL_CreateWindow("Red Green", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);

    SDL_Renderer *renderer = SDL_CreateRenderer(window, 0, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

    bool quit = false;
    SDL_Event event;

    SDL_Texture *green_part = IMG_LoadTexture(renderer, "Green400x600.png");
    SDL_Texture *red_part = IMG_LoadTexture(renderer, "Red400x600.png");

    while (!quit) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                quit = true;
            }
        }

        SDL_RenderClear(renderer);
        SDL_Rect copy_rect{0, 0, 400, 600};
        SDL_RenderCopy(renderer, green_part, nullptr, &copy_rect);
        // We now draw from half the screen onward x position = WIDTH / 2.
        copy_rect.x = 400; 
        SDL_RenderCopy(renderer, red_part, nullptr, &copy_rect);

        SDL_RenderPresent(renderer);
    }

    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
    SDL_Quit();

    return 0;
}

推荐阅读