【问题标题】:Showing a video using two textures SDL2使用两个纹理 SDL2 显示视频
【发布时间】:2018-05-29 00:38:48
【问题描述】:

我需要构建一个界面,在屏幕左侧显示一个流媒体视频的一部分,而在右侧显示另一部分。像这样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);

任何建议都会很棒!

【问题讨论】:

  • 定义“不起作用”。我只看到一个有问题的纹理,第二个纹理是否相关?音高怎么了?
  • 嘿,“不起作用”我的意思是尽管定义了 SDL_Rect 纹理填充所有渲染(窗口)。

标签: c++ sdl-2


【解决方案1】:

如果不发布 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多