您的位置:首页 > 其它

FFmpeg与SDL双剑合璧之MFC

2015-09-18 15:42 225 查看
在前面的一篇文章中,记录了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


播放效果如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: