Показ видео с использованием двух текстур SDL2 - PullRequest
0 голосов
/ 27 мая 2018

Мне нужно построить интерфейс, где на левой стороне экрана отображается часть одного потокового видео, а на правой стороне - другая часть.Примерно так: 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);

Любой совет будет отличным!

1 Ответ

0 голосов
/ 28 мая 2018

Без вашей публикации MCVE трудно понять, где вы ошиблись.Я думаю, что ваша позиция х неверна.Вот пример, где я показываю, как нарисовать 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;
}
...