FFmpeg与SDL双剑合璧之MFC
2015-09-18 15:42
225 查看
在前面的一篇文章中,记录了FFMPEG解码与SDL结合,显示视频的效果;但是用SDL创建的窗口;不便于真正的使用加工,如果需要嵌入到MFC中,就强大许多了。
还是前面的代码(FFmpeg与SDL双剑合并之windows),核心的地方,就是创建视频窗口时做小许改动:
注释掉的内容是win32程序的,需要改成SDL_CreateWinowFrom函数的调用;
来一段比较粗糙的调用方式:
其中,下面几个ID分别是MFC中,控件的ID
播放效果如下:
还是前面的代码(FFmpeg与SDL双剑合并之windows),核心的地方,就是创建视频窗口时做小许改动:
int CSDLPlayer::InitPlayer(int nWinW, int nWinH,void *pData) { if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) { return -1; } //m_pPlayer=SDL_CreateWindow("Hello SDL", // SDL_WINDOWPOS_UNDEFINED, // SDL_WINDOWPOS_UNDEFINED, // nWinW,nWinH, // SDL_WINDOW_RESIZABLE|SDL_WINDOW_OPENGL); m_pPlayer=SDL_CreateWindowFrom(pData); SDL_Thread *refresh_thread = SDL_CreateThread(Thread2Refresh,NULL,NULL); return 0; }
注释掉的内容是win32程序的,需要改成SDL_CreateWinowFrom函数的调用;
来一段比较粗糙的调用方式:
int nFrameW=0,nFrameH=0; //第一个窗口 m_dec[0].OpenFile("F:\\Video\\h265\\4K风光6声道2012.mkv"); m_dec[0].GetMediaInfo(nFrameW,nFrameH); m_player[0].InitPlayer(800,600,(void*)GetDlgItem(IDC_WND_PLATYER)->GetSafeHwnd()); m_player[0].InitTexture(nFrameW,nFrameH); //第二个窗口 m_dec[1].OpenFile("F:\\Video\\h265\\4K鸭子起飞.mp4"); m_dec[1].GetMediaInfo(nFrameW,nFrameH); m_player[1].InitPlayer(800,600,(void*)GetDlgItem(IDC_WND_PLATYER2)->GetSafeHwnd()); m_player[1].InitTexture(nFrameW,nFrameH); //第三个窗口 m_dec[2].OpenFile("F:\\Video\\h265\\美女吃烤鸭.2160P.42秒.HD.Club-4K-Chimei-inn-60mbps.mp4"); m_dec[2].GetMediaInfo(nFrameW,nFrameH); m_player[2].InitPlayer(800,600,(void*)GetDlgItem(IDC_WND_PLATYER3)->GetSafeHwnd()); m_player[2].InitTexture(nFrameW,nFrameH); //第四个窗口 m_dec[3].OpenFile("F:\\Video\\Wild.mp4"); m_dec[3].GetMediaInfo(nFrameW,nFrameH); m_player[3].InitPlayer(0,0,(void*)GetDlgItem(IDC_WND_PLATYER4)->GetSafeHwnd()); m_player[3].InitTexture(nFrameW,nFrameH); AVFrame *pFrame0=av_frame_alloc(); AVFrame *pFrame1=av_frame_alloc(); AVFrame *pFrame2=av_frame_alloc(); AVFrame *pFrame3=av_frame_alloc(); while(1) { if(m_dec[0].GetOneFrame(pFrame0)>0) { m_player[0].InputFrame(pFrame0->data[0],pFrame0->linesize[0], pFrame0->data[1],pFrame0->linesize[1], pFrame0->data[2],pFrame0->linesize[2]); } if(m_dec[1].GetOneFrame(pFrame1)>0) { m_player[1].InputFrame(pFrame1->data[0],pFrame1->linesize[0], pFrame1->data[1],pFrame1->linesize[1], pFrame1->data[2],pFrame1->linesize[2]); } if(m_dec[2].GetOneFrame(pFrame2)>0) { m_player[2].InputFrame(pFrame2->data[0],pFrame2->linesize[0], pFrame2->data[1],pFrame2->linesize[1], pFrame2->data[2],pFrame2->linesize[2]); } if(m_dec[3].GetOneFrame(pFrame3)>0) { m_player[3].InputFrame(pFrame3->data[0],pFrame3->linesize[0], pFrame3->data[1],pFrame3->linesize[1], pFrame3->data[2],pFrame3->linesize[2]); } }
其中,下面几个ID分别是MFC中,控件的ID
IDC_WND_PLATYER
IDC_WND_PLATYER2
IDC_WND_PLATYER3
IDC_WND_PLATYER4
播放效果如下:
相关文章推荐
- Android Style.xml 详解
- 蔡学镛:让架构接地气,不再云里雾里
- JS判断浏览器类型
- JavaScript
- jquery.validate.js实例演示
- lintcode——删除链表中倒数第n个节点(链表)
- NSArray 数组排序
- Iterator 和 JAVA遍历的一些仿写 学习
- C++ Primer Plus 第6版 中文版 第7章编程练习
- URL编码表%20Base64编码表%20HTTP消息含义
- C++读入输出优化
- spring
- springmvc表单标签
- 一个请求返回多个应答消息的支持
- 关于 sql语句的一些小优化
- Cannot refer to a non-final variable inside an inner class defined in a different method
- jQuery插件Flot的介绍
- Android SDK 在线更新镜像服务器资源
- android ListView、GridView、ExpandableListView的performItemClick方法
- 2700:Parity