#include <stdio.h>
#include "FFmpegVideo.h"
//#include "widget.h"
#pragma warning(disable:4996)
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
extern "C"
{
#include "SDL.h"
#include <SDL_syswm.h>
}
#include <Windows.h>
#pragma execution_character_set("utf-8")
//Refresh Event
#define SFM_REFRESH_EVENT (SDL_USEREVENT + 1)
#define SFM_BREAK_EVENT (SDL_USEREVENT + 2)
#define SIZE_MOVE_TIMER_ID 1
int thread_exit = 0;
int thread_pause = 0;
std::mutex mutex_;
SDL_Window* screen;
SDL_Renderer* sdlRenderer;
FFmpegVideo* V1;
int sfp_refresh_thread(void* opaque) {
thread_exit = 0;
thread_pause = 0;
while (!thread_exit) {
if (!thread_pause) {
SDL_Event event;
event.type = SFM_REFRESH_EVENT;
SDL_PushEvent(&event);
}
SDL_Delay(40);
}
thread_exit = 0;
thread_pause = 0;
//Break
SDL_Event event;
event.type = SFM_BREAK_EVENT;
SDL_PushEvent(&event);
return 0;
}
//启动超时推送线程
static void GetStreamThread(PVOID param) {
FFmpegVideo* vv = (FFmpegVideo*)param;
vv->Run();
};
//创建一个拉流线程,并启动它
FFmpegVideo* StartOne(char* filepath, SDL_Renderer* sdlRenderer, int x0, int y0, int w0, int h0) {
FFmpegVideo* V1 = new FFmpegVideo(filepath, sdlRenderer, x0, y0, w0, h0);
V1->Init();
HANDLE h1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GetStreamThread, (PVOID)V1, 1, 0); //创建子线程
ResumeThread(h1); //启动子线程
return V1;
}
char* wcharToChar(const wchar_t* s)
{
size_t len = wcslen(s) + 1;
size_t converted = 0;
char* CStr;
CStr = (char*)malloc(len * sizeof(char));
wcstombs_s(&converted, CStr, len, s, _TRUNCATE);
return CStr;
}
int eventFilter(void* pthis, const SDL_Event *event)
{
if (event->type == SDL_WINDOWEVENT &&
event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
{
int width = 0;
int height = 0;
SDL_RenderSetViewport(sdlRenderer, NULL);
V1->Play();
int nret = SDL_RenderClear(sdlRenderer);
V1->RenderCopy();
SDL_RenderPresent(sdlRenderer);
printf("@@@@@ %d\n", nret);
}
return 1;
}
bool sizeMoveTimerRunning = false;
int eventWatch(void*, SDL_Event* event)
{
if (event->type == SDL_SYSWMEVENT)
{
const auto& winMessage = event->syswm.msg->msg.win;
if (winMessage.msg == WM_ENTERSIZEMOVE)
{
// the user started dragging, so create the timer (with the minimum timeout)
// if you have vsync enabled, then this shouldn't render unnecessarily
sizeMoveTimerRunning = SetTimer(GetActiveWindow(), SIZE_MOVE_TIMER_ID, USER_TIMER_MINIMUM, nullptr);
}
else if (winMessage.msg == WM_TIMER)
{
if (winMessage.wParam == SIZE_MOVE_TIMER_ID)
{
// call your render function
V1->Play();
SDL_RenderClear(sdlRenderer);
V1->RenderCopy();
SDL_RenderPresent(sdlRenderer);
int width = 0;
int height = 0;
SDL_GetWindowSize(screen, &width, &height);
V1->SetPosition(0, 0, int(width), int(height));
}
}
}
return 0;
}
int sdl_go()
{
printf("start \n");
SDL_Event event;
char* title = new char[200]{ "Keep window active while being dragged" };
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
printf("Could not initialize SDL - %s\n", SDL_GetError());
return -1;
}
screen = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
720, 480, SDL_WINDOW_RESIZABLE);//
if (!screen) {
printf("SDL: could not create window - exiting:%s\n", SDL_GetError());
return -1;
}
//char* filepath = new char[200]{ "rtsp://admin:admin12345@192.168.10.10:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif" };
char* filepath = new char[200]{ "D:/videos/1122_3min.mp4" };
sdlRenderer = SDL_CreateRenderer(screen, -1, 0);
int width, height;
SDL_GetWindowSize(screen, &width, &height);
V1 = StartOne(filepath, sdlRenderer, 0, 0, int(width), int(height));
SDL_Thread* video_tid = SDL_CreateThread(sfp_refresh_thread, NULL, NULL);
SDL_AddEventWatch(eventWatch, nullptr); // register the event watch function
SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); // we need the native Windows events, so we can listen to WM_ENTERSIZEMOVE and WM_TIMER
for (;;) {
//Wait
SDL_WaitEvent(&event);
if (sizeMoveTimerRunning) {
// modal drag/size loop ended, so kill the timer
KillTimer(GetActiveWindow(), SIZE_MOVE_TIMER_ID);
sizeMoveTimerRunning = false;
}
if (event.type == SFM_REFRESH_EVENT)
{
//循环播放每一帧
V1->Play();
SDL_RenderClear(sdlRenderer);
V1->RenderCopy();
SDL_RenderPresent(sdlRenderer);
}
else if (event.type == SDL_WINDOWEVENT)
{
//动态掉整位置
//SDL_GetWindowSize(screen, &width, &height);
//V1->SetPosition(0, 0, int(width ), int(height ));
SDL_GetWindowSize(screen, &width, &height);
V1->SetPosition(0, 0, int(width), int(height));
}
else if (event.type == SDL_KEYDOWN)
{
//Pause
/*if (event.key.keysym.sym == SDLK_SPACE) {
thread_pause = !thread_pause;
}*/
}
else if (event.type == SDL_QUIT) {
thread_exit = 1;
return 0;
}
else if (event.type == SFM_BREAK_EVENT) {
break;
}
SDL_Delay(0);// 延迟40毫秒
}
SDL_Quit();
}
int main(int argc, char* argv[])
{
std::thread t1(sdl_go);
t1.detach();
while (1)
{
Sleep(10);
}
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
SDL2 拖拽 SDL2 拖拽

共38个文件
tlog:10个
cpp:4个
pdb:4个

需积分: 0 36 浏览量
2022-08-11
13:41:43
上传
评论
收藏 1.2MB ZIP 举报
SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽SDL2 拖拽
资源详情
资源评论
资源推荐
收起资源包目录

















































共 38 条
- 1

















文三~
- 粉丝: 25
- 资源: 9

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制

评论0