获取yuv
先随便找个mp4,给转成yuv
ffmpeg -i 1.mp4 -pix_fmt yuv420p 1.yuv
示例代码
#include "SDL.h"
#include <iostream>
#include <thread>
#include <vector>
#define SDL_QUIT_EVENT (SDL_USEREVENT + 1)
#define SDL_REFRESH_EVENT (SDL_USEREVENT + 2)
int main(int argc, char* argv[])
{
SDL_Init(SDL_INIT_VIDEO);
SDL_Rect rect;
rect.x = rect.y = 0;
rect.w = 320;
rect.h = 568;
SDL_Window* window = SDL_CreateWindow("123", 100, 100, rect.w, rect.h, SDL_WINDOW_SHOWN);
SDL_ShowWindow(window);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
SDL_Texture* texture = SDL_CreateTexture(renderer,
SDL_PIXELFORMAT_IYUV,
SDL_TEXTUREACCESS_STREAMING,
rect.w,
rect.h);
std::vector<uint8_t> v(rect.w * rect.h + rect.w * rect.h / 4 + rect.w * rect.h / 4);
FILE* wj = fopen("1.yuv", "rb");
bool bContinue = true;
std::thread t([&]() {
while (bContinue)
{
std::cout << "refresh" << std::endl;
SDL_Event ev_re;
ev_re.type = SDL_REFRESH_EVENT;
SDL_PushEvent(&ev_re);
std::this_thread::sleep_for(std::chrono::milliseconds(40));
}
});
t.detach();
SDL_Event ev;
while (bContinue)
{
SDL_WaitEvent(&ev);
switch (ev.type)
{
case SDL_QUIT:
bContinue = false;
break;
case SDL_KEYDOWN:
if (SDLK_a == ev.key.keysym.sym)
{
std::cout << "press a" << std::endl;
}
else if (SDLK_q == ev.key.keysym.sym)
{
std::cout << "press q" << std::endl;
SDL_Event ev_quit;
ev_quit.type = SDL_QUIT_EVENT;
SDL_PushEvent(&ev_quit);
}
break;
case SDL_QUIT_EVENT:
bContinue = false;
break;
case SDL_REFRESH_EVENT:
if (!feof(wj))
{
fread(v.data(), 1, v.size(), wj);
SDL_UpdateTexture(texture, &rect, v.data(), rect.w);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, &rect);
SDL_RenderPresent(renderer);
}
break;
}
}
fclose(wj);
SDL_DestroyWindow(window);
return 0;
}
直接跑就行了