AVIHandler.cpp
上传用户:smdfuse
上传日期:2015-11-06
资源大小:98k
文件大小:2k
源码类别:

图形图象

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "AVIHandler.h"
  3. #include <vfw.h>
  4. #pragma comment(lib,"vfw32.lib")
  5. AVIHandler::AVIHandler(void):gray_value(NULL),gray_value_square(NULL)
  6. {
  7. this->loaded = FALSE;
  8. }
  9. AVIHandler::AVIHandler(CString filename):gray_value(NULL),gray_value_square(NULL)
  10. {
  11. this ->loaded = FALSE;
  12. LoadVideo(filename);
  13. }
  14. AVIHandler::~AVIHandler(void)
  15. {
  16. if(gray_value != NULL) free(gray_value);
  17. if(gray_value_square != NULL) free(gray_value_square);
  18. }
  19. //加载视频数据
  20. BOOL AVIHandler::LoadVideo(CString filename)
  21. {
  22. //读取AVI文件信息
  23. HRESULT result;
  24. AVIFileInit(); //使用AVI族函数读取AVI文件前应首先调用
  25. PAVIFILE pfile;//AVI文件指针
  26. AVIFILEINFO pfi;//AVI文件信息
  27. PAVISTREAM pavi;//AVI流
  28. AVISTREAMINFO stinfo;//AVI流信息
  29. //CString file = "d:plane.avi";
  30. //打开AVI文件
  31. result=AVIFileOpen(&pfile,filename,OF_READ,NULL);
  32. //AVI文件信息
  33. result=AVIFileInfo(pfile,&pfi,sizeof(AVIFILEINFO));
  34. //获得AVI视频流
  35. result=AVIFileGetStream(pfile,&pavi,streamtypeVIDEO, 
  36. 0);
  37. //获得AVI视频流信息
  38. result=AVIStreamInfo(pavi,&stinfo,sizeof(AVISTREAMINFO));
  39. //获得AVI包
  40. pgf = AVIStreamGetFrameOpen(pavi,NULL);
  41.  
  42.     if (pgf==NULL)
  43.     {
  44. //数据出错
  45. return FALSE;
  46.     }
  47. HRESULT hr;
  48. //获得特想的宽和高
  49. int cx=pfi.dwWidth;//图象宽、高
  50. int cy=pfi.dwHeight;
  51. width=cx;
  52. height=cy;
  53. length=pfi.dwLength;
  54. //使用默认长度,只处理100帧
  55. //length=50;
  56. //AVI桢格式,位图Header,位图具体格式。
  57. lpbm = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf,1);
  58. defaultPad=3;
  59. //分配缓冲内存空间
  60. //非填充缓冲
  61. gray_value = (unsigned char*)malloc(sizeof(unsigned char)*width*height*3);
  62. //填充缓冲
  63. gray_value_square = (unsigned char*)malloc(sizeof(unsigned char)*(width+defaultPad)*(height+defaultPad)*3);
  64. this->loaded = TRUE;
  65. return TRUE;
  66. }
  67. //获得一个Frame
  68. unsigned char* AVIHandler::GetSingleFrame(int i)
  69. {
  70. return (unsigned char*)AVIStreamGetFrame(pgf,i)+40;
  71. //return NULL;
  72. }
  73. int AVIHandler::GetFrameCount(void)
  74. {
  75. return this->length;
  76. }
  77. int AVIHandler::GetFrameWidth(void)
  78. {
  79. return this->width;
  80. //return 0;
  81. }
  82. int AVIHandler::GetFrameHeight(void)
  83. {
  84. return this->height;
  85. //return 0;
  86. }
  87. //返回图像的BMP格式数据
  88. LPBITMAPINFOHEADER AVIHandler::GetLPBM(void)
  89. {
  90. return this->lpbm;
  91. }
  92. BOOL AVIHandler::isLoaded(void)
  93. {
  94. return this->loaded;
  95. }