//#define SDL_MAIN_HANDLED
#include<SDL.h>
#include<iostream>
using namespace std;
int main(int argc, char* argv[]) {
//very important and serious about YUV format
//cif 352*288 , otherwise fail to play!!!
const int width = 352, height = 288;
//QCIF:176*144
//const int width = 176, height = 144;
const int bpp=12;//bits per pixel 像素深度
byte buffer[width*height*bpp/8];
if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) == -1) {
cout << "sdl init error" << endl;
return -1;
}
cout << "sdl init OK" << endl;
//atexit(SDL_Quit);
SDL_Window* screen = SDL_CreateWindow("SDL Demo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height,
SDL_WINDOW_RESIZABLE);
if (!screen) {
cout << "SDL create window failed" << endl;
return -2;
}
SDL_Renderer* renderer = SDL_CreateRenderer(screen, -1, 0);
//IYUV: Y+U+V
//YU12: Y+V+U
Uint32 pixformat = SDL_PIXELFORMAT_IYUV;
SDL_Texture* texture = SDL_CreateTexture(renderer, pixformat, SDL_TEXTUREACCESS_STREAMING, width, height);
FILE* file;
fopen_s(&file,"C:/Users/Dell/Desktop/BigBuckBunny_CIF_24fps.yuv", "rb+");
//fopen_s(&file,"C:/Users/Dell/Desktop/akiyo_qcif.yuv", "rb+");
if (file == NULL) {
cout << "cannot open this file\n" << endl;
return -5;
}
SDL_Rect rect;
while (1) {
if (fread(buffer, 1, width * height * bpp / 8, file) != width * height * bpp / 8) {
// Loop
fseek(file, 0, SEEK_SET);
fread(buffer, 1, width * height * bpp / 8, file);
SDL_Delay(40);
}
//cout << SDL_GetError() << endl;
SDL_UpdateTexture(texture, NULL, buffer, width);
rect.x = 0;
rect.y = 0;
rect.w = width;
rect.h = height;
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, &rect);
SDL_RenderPresent(renderer);
//Delay 40ms
SDL_Delay(40);
}
SDL_Quit();
cout << "sdl quit" << endl;
cout << "Hello World" << endl;
return 0;
}
1.YUV 播放文件的 宽度和高度 要 适配 否则,播放有问题,满屏花色。
2.main 函数要有标准参数,否则编译错误。
3.静态编译的时候请加上这些库文件
SDL2-staticd.lib
SDL2_test.lib
Winmm.lib
Version.lib
Imm32.lib
Setupapi.lib
SDL2maind.lib
,
否则,光报错。
5.播放存在文件,不是调试模式下运行一会就会卡住,不能播放,且鼠标失灵,估计是主线渲染画面的问题。启用多线线程该如何解决?