怎么实现的SDL播放画面嵌入MFC控件中去的
发布网友
发布时间:2022-04-22 05:57
我来回答
共1个回答
热心网友
时间:2023-08-14 12:31
下面是代码片段:
SDL_Event event;
static struct SwsContext *img_convert_ctx;
char * filePath="c:/test.mp4";
/************************************************************************/
/* 测试SDL窗口显示到mfc对话框中 */
/************************************************************************/
char variable[256];
CWnd* pWnd = this->GetDlgItem(IDC_VIEW); //获取图片控件的窗口指针
sprintf(variable,"SDL_WINDOWID=0x%1x",pWnd->GetSafeHwnd()); // 格式化字符串
SDL_putenv(variable);
//这句是最重要的了,将上面的字符串传入即可
//剩下的就是设置视频播放大小的问题了,自己可以随便改
SDL_Rect rect; //设置好播放的大小后传入SDL_SetVideoMode RECT rc;
pWnd->GetWindowRect(&rc);
rect.x = 0; rect.y = 0;
rect.w = rc.right-rc.left; rect.h = rc.bottom-rc.top;
// Register all formats and codecs avcodec_register_all();
av_register_all();
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
exit(1);
}
以下N行代码都是解码的部分,就不写了,主要写和SDL嵌入有关的
下面这句大家是相当的熟悉了,用过SDL播放的都应该知道
// Make a screen to put our video
screen = SDL_SetVideoMode(rect.w, rect.h, 0, 0); //此处需要设置成缩放大小
if(!screen) {
exit(1);
}
不知道大家看明白没?其实实现这个功能一共就需要四行代码,大家是不是有种蛋碎的感觉?
char variable[256];
CWnd* pWnd = this->GetDlgItem(IDC_VIEW); //获取图片控件的窗口指针
sprintf(variable,"SDL_WINDOWID=0x%1x",pWnd->GetSafeHwnd());
// 格式化字符串
SDL_putenv(variable);
//这句是最重要的了,将上面的字符串传入即可
只要把上面的SDL_WINDOWID传入后,不管你怎么画图,播放视频,都是在那个控件中显示!
这个问题绝对不是我第一个想出来的,肯定有人已经知道,但是就这么一个简单的问题,百度上却没有一个人说明!可见中国的大环境啊! 为了刚接触ffmpeg的TX少走弯路我会后续写自己对SDL在MFC中运作的一些体会。