目的
渲染主要是为了测试下程序,尽量确保在添加FFmpeg 之前,SDL 层出现BUG。 次文件可以简单作为模板使用。 也可以简单封装成C++类文件,方便使用。这里不展开了
之后会创建一个FFmpeg播放类。然后在这里直接调用FFmpeg 就可以 做一个简单的万能播放器了。
渲染颜色
运行代码可以看到创建一个窗口,随机产生一个颜色的背景,然后开始不停的渐变颜色 。 源码非常简单。不到100行 直接上代码了。
代码跟之前不同,主要是添加了,一些判断,毕竟C代码是一定要释放内存的,这里简单把之前的内容去掉的部分先补上。
#include <iostream>
using namespace std;
extern "C" {
#include "SDL.h"
}
int main(int argc, char* argv[]) {
int ret = -1;
//set defualt size of window
int video_width = 640;
int video_height = 480;
//此处为SDL 渲染部分 需要的代码
SDL_Window* window;
SDL_Renderer* renderer;
SDL_Texture* texture;
SDL_Rect sdlRect{ 0,0, video_width, video_height };
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "ERROR SDL_Init - %s\n", SDL_GetError());
return ret;
}
window = SDL_CreateWindow("Easy Player",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
video_width, video_height,
SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
if (window == NULL) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "ERROR SDL_CreateWindow - %s\n", SDL_GetError());
return -1;
}
renderer = SDL_CreateRenderer(window, -1, 0);
if (!renderer) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "ERROR SDL_CreateRenderer - %s\n", SDL_GetError());
return -1;
}
int pixformat = SDL_PIXELFORMAT_IYUV;
texture = SDL_CreateTexture(renderer,
pixformat,
SDL_TEXTUREACCESS_STREAMING,
video_width,
video_height);
if (!texture) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "ERROR SDL_CreateTexture - %s\n", SDL_GetError());
return -1;
}
int count = 1000;
int color_r = 255;
int color_g = 255;
int color_b = 255;
while (count--) {
//SDL_UpdateYUVTexture(texture, NULL,
// pict->data[0], pict->linesize[0],
// pict->data[1], pict->linesize[1],
// pict->data[2], pict->linesize[2]);
// 测试 修改 颜色 此处 应该调用 FFmpeg 来显示视频数据就OK 了
//SDL_SetRenderDrawColor(renderer, 255, 255, 0, 255);// 默认黄色
color_r = (color_r += 1) % 255;
color_g = (color_g += 2) % 255;
color_b = (color_b += 3) % 255;
cout << "color_r = " << color_r << " color_g = " << color_g << " color_b = " << color_b << endl;
SDL_SetRenderDrawColor(renderer, color_r, color_g, color_b, 255);
SDL_RenderClear(renderer);
//SDL_RenderCopy(renderer, texture, NULL, &sdlRect);
SDL_RenderPresent(renderer);
SDL_Delay(40);
}
if (texture) { SDL_DestroyTexture(texture); }
if (renderer) { SDL_DestroyRenderer(renderer); }
if (window) { SDL_DestroyWindow(window); }
// Clean up
SDL_Quit();
return 0;
}