SDL播放yuv

`SDL播放yuv`

获取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;
}

直接跑就行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值