FFmpeg与SDL双剑合璧之MFC
在前面的一篇文章中,记录了FFMPEG解码与SDL结合,显示视频的效果;但是用SDL创建的窗口;不便于真正的使用加工,如果需要嵌入到MFC中,就强大许多了。
还是前面的代码(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
播放效果如下:
posted on 2017-10-12 21:27 zhuxian2009 阅读(255) 评论(0) 编辑 收藏 举报