AVI 视频文件的播放

来源:互联网 发布:贵阳 软件著作权资助 编辑:程序博客网 时间:2024/05/01 13:47

项目组最近需要我开发写一个播放器程序,到今天这个工作基本上完成了,在开发过程中,需要让播放器支持AVI视频文件。对于AVI文件的操作之前接触较少,经过这些天的摸索,终于有了一些自己的看法。

AVI(Audio Video Interleaved)是将语音和影像同步组合在一起的文件格式。它对视频文件采用了一种有损压缩方式,但压缩比较高,尽管画面质量不是太好,但其应用范围仍然非常广泛。

///////////////////////////////////////结构说明//////////////////////////////////

 

PAVIFILE                      pfile;

AVIFILEINFO        *pfi; // avi信息

AVISTREAMINFO           psi;                // 包含流信息的结构体的指针

PAVISTREAM            pavi;               // avi文件流句柄

PGETFRAME            pFrame ;           // GetFrame对象的指针

BITMAPINFOHEADER    bmih;               // 头信息 For DrawDibDraw

////////////////////////////////////////////////////////////////////////////////////


 

对于AVI视频文件的播放,主要有以下的步骤:

1:

调用AVIFileInit(),初始化AVI文件库

2:  

CoInitialize(NULL);

// 根据lpszPathName以只读的方式打开AVI文件

if (0 != AVIFileOpen(&pfile,lpszPathName,OF_READ,NULL))

{

AfxMessageBox(_T("Failed to open AVI File!"));

return; 

}

// 获取AVI文件信息

if (0 != AVIFileInfo(pfile,pfi,sizeof(AVIFILEINFO)))

{

AfxMessageBox(_T("Failed to get FileInformatin !"));

return; 

}

// 获取AVI文件中的视频流

if (0 != AVIFileGetStream(pfile, &pavi, streamtypeVIDEO,0))

{

AfxMessageBox(_T("Failed to get FileStreamInformation !"));

return; 

}

 

// 视频流信息

AVISTREAMINFO psi;

AVIStreamInfo(pavi,&psi,sizeof(AVISTREAMINFO));  

3:

// AVIStreamGetFrameOpen()后需要调用GetFrameClose()

pFrame = AVIStreamGetFrameOpen(m_aviFlie.pavi, &m_videoBitmapInfo);

if (NULL == pFrame)

{

     ....

}

else

{

    ....

}

4:

// 存位图的头信息

LPBITMAPINFOHEADER lpbi;    

   // 从AVI流中得到数据

lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pFrame, m_videoCurFrame); 

// 数据指针,由AVIStreamGetFrame返回(跳过头信息和色彩信息)

pbDecodedData =(BYTE *)lpbi+lpbi->biSize+lpbi->biClrUsed * sizeof(RGBQUAD);    (注:这个地方让我苦恼      了很久啊~~~~)

// 利用数据进行显示

SetStretchBltMode(memDC.m_hDC,COLORONCOLOR);

StretchDIBits(

memDC.m_hDC,

rect.left,

rect.top,

rect.Width(),

rect.Height(),

0,

0,

m_videoBitmapInfo.biWidth,

m_videoBitmapInfo.biHeight,

pbDecodedData,

(CONST BITMAPINFO *)pBitmap,

DIB_RGB_COLORS,

SRCCOPY

);

5:

AVIFileRelease(pfile);  // close file

AVIFileExit();          // releases AVIFile library 

原创粉丝点击