420yuv播放器的制作方法
- 格式:doc
- 大小:510.50 KB
- 文档页数:11
420yuv播放器的制作方法
(1)创建MFC
打开VS2008软件,创建一个MFC对话框应用程序(Dialog-based Application),在名称栏输入创建项目的名称,点击“确定”。如下图所示:
在出现的“MFC应用程序向导”对话框内,选择“基于对话框”,并取消“使用Unicode库(N)”其他选项不做修改,单击“下一步”,如下图所示:
然后点击完成即可创建一个MFC对话框。如下图所示:
(2)点击删除和
(3)在工具箱中点击,添加此控制键。同时修改属性中
ID为IDC_PICTURE,设计type为Rectangle。操作完成
后见到如下图
(4)在工具箱中点击在上图右边空白处添加五个按钮如图
(5)点击···并修改其属性栏中Caption项的名称分别为OPEN,PLAY,PAUSE,FORWARD 1,EXIT,同时修改其ID为IDC_OPEN,IDC_PLAY,IDC_PAUSE,IDC_FORWARD,IDCANCEL,修改后如图
。接着点击属性栏中的控制事件按钮,弹出如下对
话框选择分别添
加:OnBnClickedOpen(),OnBnClickedPlay(),OnBnClickedPause(),OnBnClickedForward()。完成后如下图
(6)右击所添加的picture控制键,选择添加变量,并改其变量名为m_picture,然后在类
视图下,右击选择“添加”,“添加变量”然后弹出如下对话框
然后输入变量类型为HANDLE,变量名为hPlayTemp。点击完成。以此方法一个个添加如下变量类型分别char [64],char [260],CWinThread *,FILE *,变量名分别为inSeqence,inSeqName,m_pWinThread,ptrSource。
(7)
在头文件987654Dlg.h中添加(在后面“}”内添加)
public:
void YUVToRGB(int Y, int U, int V, int* RPtr, int* GPtr, int* BPtr);
public:
// 将一帧YUV数据转换为DIB位图
void YUVPictureToDIB(void);
(8)在源文件中打开Dlg.cpp,在和间添加#include"stdafx.h"
#include
#include
#include
#include
#include
#include
#define dwWidth 352
#define dwHeight 288
#define ByteForPixel 2
#define NumberOfFrame 199
#define ms_per_frame 33
#define BrightnessAdjust 250 // only help to display, it will not affect anything else
int t1,t2;
#define FrameSize dwWidth*dwHeight+dwWidth/2*dwHeight/2+dwWidth/2*dwHeight/2 //Y+U+V,for yuv420 , two bytes for each pixel
#define YSize dwWidth*dwHeight
#define USize dwWidth*dwHeight/4
#define VSize dwWidth*dwHeight/4
#define UPluseVSize dwWidth*dwHeight/2
BYTE Frame[FrameSize];
double delta[FrameSize];
BYTE FYComponent[YSize]; // Foreground Y component. be careful, BYTE means integers -128----127 only;
BYTE FUComponent[USize];
BYTE FVComponent[VSize];
BYTE ViewBuffers[288][352][3]; //RGB 24
BITMAPINFO BitmapInfo={ // this struct is for very old version windowns, when the frame is displayed,
// this information is needed.
{
sizeof(BITMAPINFOHEADER),
dwWidth,
dwHeight,
1,
24,
BI_RGB,
0,
0,// biXPelsPerMeter;
0,// biYPelsPerMeter;
0,
0}
};
(9)在的下面添加
BOOL g_Play = true;
BOOL g_Forward = true;
// 播放
UINT PlayVideo(LPVOID pParam)
{ CYUVPlayer02Dlg*Dlg=(CYUVPlayer02Dlg *)pParam;
HDC hDC;
HWND hWnd;
hWnd=Dlg->m_picture.GetSafeHwnd();
hDC=::GetDC(hWnd);
if(Dlg->ptrSource!=NULL)
{
for (int j=0; j { t1=GetTickCount(); // start the timer fread(FYComponent,1,YSize,Dlg->ptrSource); // read Y component fread(FUComponent,1,USize,Dlg->ptrSource); // read U component fread(FVComponent,1,VSize,Dlg->ptrSource); // read V component Dlg->YUVPictureToDIB(); SetDIBitsToDevice(hDC,0,0,dwWidth,dwHeight,0,0,0,dwHeight,&ViewBuffers[0][0][0],&BitmapInfo,DIB_RGB _COLORS); g_Forward=false; while(!g_Play) { SetDIBitsToDevice(hDC,0,0,dwWidth,dwHeight,0,0,0,dwHeight,&ViewBuffers[0][0][0],&BitmapInfo,DIB _RGB_COLORS); if(g_Forward)break; } t1 += ms_per_frame; t2 = t1 - GetTickCount(); if (t2 > 0) Sleep(t2); } fclose(Dlg->ptrSource);