怎么实现的SDL播放画面嵌入MFC控件中去的。

来源:互联网 发布:centos samba图形界面 编辑:程序博客网 时间:2024/05/03 05:28
下面是代码片段: 

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中运作的一些体会。 
 
本人也是刚接触ffmpeg和SDL半个多月的时间,很深层次的东西我也不懂,我只是把怎么实现的说出来,至于SDL_putenv(variable);有什么用?为什么这个函数传入到SDL后就能在控件中显示,我不想回答,我也不想深入研究这个东西,SDL开发出来就是为了方便我们开发者使用,如果什么都要搞那么清楚那我问问你?为什么你用VS而不用汇编写呢?

0 0
原创粉丝点击