DIGITALVIDEO.CPP
上传用户:shonly
上传日期:2022-06-05
资源大小:1939k
文件大小:7k
源码类别:

多媒体

开发平台:

Visual C++

  1. // DigitalVideo.cpp: implementation of the CDigitalvideo class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "VideoPlayer.h"
  6. #include "Digitalvideo.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CDigitalvideo::CDigitalvideo()
  16. {
  17. // 初始化成员变量
  18. m_Open = m_Pause = m_Playing = FALSE;
  19. m_DeviceID = 0;
  20. }
  21. CDigitalvideo::~CDigitalvideo()
  22. {
  23. Close ();
  24. }
  25. BOOL CDigitalvideo::GetPause ()//是否暂停
  26. {
  27. return m_Pause;
  28. }
  29. BOOL CDigitalvideo::Open (CString Filename, CWnd *pWnd, int left, int top,int width,int height)
  30. {
  31. if (!m_Open){//如果m_Open=false,没有打开设备
  32. // 初始化成员变量
  33. m_Open = m_Pause = m_Playing = FALSE;
  34. m_DeviceID = 0;
  35. // 文件是否存在
  36. CFileStatus Status;
  37. if (!CFile::GetStatus (Filename, Status))
  38. return FALSE;
  39. // 打开设备
  40. MCI_DGV_OPEN_PARMS MCIOpen;
  41. MCIOpen.lpstrDeviceType = "avivideo";//设置播放设备为视频播放设备
  42. MCIOpen.lpstrElementName = (LPSTR) Filename.GetBuffer (0);//文件名
  43. MCIOpen.wDeviceID = NULL;
  44. MCIOpen.hWndParent = pWnd->m_hWnd;//可播放视频文件窗口指针
  45. MCIOpen.dwStyle = WS_CHILD | WS_VISIBLE;
  46. if (mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE |
  47. MCI_OPEN_ELEMENT | MCI_DGV_OPEN_PARENT | MCI_DGV_OPEN_WS, (DWORD)(LPVOID) &MCIOpen))
  48. return FALSE;
  49. m_DeviceID = MCIOpen.wDeviceID;
  50. m_Open = TRUE;
  51. // 将文件长度设置为帧
  52. MCI_DGV_SET_PARMS MCISet;
  53. MCISet.dwTimeFormat = MCI_FORMAT_FRAMES;
  54. if (mciSendCommand (m_DeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &MCISet)){
  55. Close ();
  56. return FALSE;
  57. }
  58. // 找到视频文件的开始位置
  59. mciSendCommand (m_DeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
  60. //将播放画面置于主窗口之中
  61. MCI_DGV_PUT_PARMS MCIPut;
  62. MCIPut.rc.left = left;
  63. MCIPut.rc.top  = top;
  64. MCIPut.rc.right = width;
  65. MCIPut.rc.bottom = height;
  66. if (mciSendCommand (m_DeviceID, MCI_PUT, MCI_WAIT | MCI_DGV_PUT_CLIENT |
  67. MCI_DGV_PUT_WINDOW | MCI_DGV_RECT, (DWORD)(LPVOID) &MCIPut)){
  68. Close ();
  69. return FALSE;
  70. }
  71. }
  72. return TRUE;
  73. }
  74. void CDigitalvideo::Close (void)
  75. {
  76. if (m_Open){// 停止播放并关闭设备
  77. if (m_Playing || m_Pause)
  78. mciSendCommand (m_DeviceID, MCI_STOP, NULL, NULL);
  79. mciSendCommand (m_DeviceID, MCI_CLOSE, NULL, NULL);
  80. // 清空成员变量
  81. m_Open = m_Pause = m_Playing = FALSE;
  82. m_DeviceID = NULL;
  83. }
  84. }
  85. //获得视频文件窗口的宽度
  86. int CDigitalvideo::GetWidth (void)
  87. {
  88. if (m_Open){
  89. MCI_DGV_WHERE_PARMS MCIWhere;
  90. if (mciSendCommand (m_DeviceID, MCI_WHERE, MCI_DGV_WHERE_SOURCE,
  91. (DWORD)(LPVOID) &MCIWhere)){
  92. return 0;
  93. }
  94. return (int) MCIWhere.rc.right;
  95. }
  96. return 0;
  97. }
  98. //获得视频文件窗口的高度
  99. int CDigitalvideo::GetHeight (void)
  100. {
  101. if (m_Open){
  102. MCI_DGV_WHERE_PARMS MCIWhere;
  103. if (mciSendCommand (m_DeviceID, MCI_WHERE, MCI_DGV_WHERE_SOURCE, 
  104. (DWORD)(LPVOID) &MCIWhere)){
  105. return 0;
  106. }
  107. return (int) MCIWhere.rc.bottom;
  108. }
  109. return 0;
  110. }
  111. BOOL CDigitalvideo::Play (BOOL bLoop, BOOL bFullScreen)
  112. {
  113. if (m_Open){
  114. // 如果是视频的尾部则重新开始播放
  115. if (GetFrame () >= GetFrames ())
  116. mciSendCommand (m_DeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
  117. // 播放
  118. MCI_DGV_PLAY_PARMS MCIPlay;
  119. MCIPlay.dwCallback = NULL;
  120. MCIPlay.dwFrom = GetFrame ();
  121. DWORD dwFlags = MCI_FROM;
  122. if (bLoop)
  123. dwFlags |= MCI_DGV_PLAY_REPEAT;
  124. if (bFullScreen)
  125. dwFlags |= MCI_MCIAVI_PLAY_FULLSCREEN;
  126. if (mciSendCommand (m_DeviceID, MCI_PLAY, dwFlags, (DWORD)(LPVOID) &MCIPlay))
  127. return FALSE;
  128. m_Pause = FALSE;
  129. m_Playing = TRUE;
  130. return TRUE;
  131. }
  132. return FALSE;
  133. }
  134. void CDigitalvideo::Stop (void)
  135. {
  136. if (m_Open && m_Playing){
  137. mciSendCommand (m_DeviceID, MCI_STOP, NULL, NULL);
  138. mciSendCommand (m_DeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
  139. m_Playing = FALSE;
  140. m_Pause = TRUE;
  141. }
  142. }
  143. void CDigitalvideo::Pause( void )
  144. {
  145. if (m_Open ){
  146. MCI_DGV_PAUSE_PARMS MCIPause;
  147. if (mciSendCommand (m_DeviceID, MCI_PAUSE, 0, (DWORD)(LPVOID) &MCIPause))
  148. return;
  149. m_Pause = TRUE;
  150. }
  151. }
  152. int CDigitalvideo::GetFrames (void)
  153. {
  154. if (m_Open){
  155. MCI_DGV_STATUS_PARMS MCIStatus;
  156. MCIStatus.dwItem = MCI_STATUS_LENGTH;
  157. if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
  158. MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
  159. return 0;
  160. return (int) MCIStatus.dwReturn;
  161. }
  162. return 0;
  163. }
  164. int CDigitalvideo::GetFrame (void)
  165. {
  166. if (m_Open){
  167. MCI_DGV_STATUS_PARMS MCIStatus;
  168. MCIStatus.dwItem = MCI_STATUS_POSITION;
  169. if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
  170. MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
  171. return -1;
  172. return (int) MCIStatus.dwReturn;
  173. }
  174. return -1;
  175. }
  176. BOOL CDigitalvideo::IsPlaying ()
  177. {
  178. if (m_Open)
  179. {
  180. MCI_DGV_STATUS_PARMS MCIStatus;
  181. MCIStatus.dwItem = MCI_STATUS_MODE;
  182. if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
  183. MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
  184. return FALSE;
  185. if (MCIStatus.dwReturn == MCI_MODE_PLAY)
  186. {
  187. m_Playing = TRUE;
  188. m_Pause = FALSE;
  189. return TRUE;
  190. }
  191. else if (MCIStatus.dwReturn == MCI_MODE_PAUSE)
  192. {
  193. m_Playing = TRUE;
  194. m_Pause = FALSE;
  195. return TRUE;
  196. }
  197. else
  198. {
  199. m_Playing = FALSE;
  200. m_Pause = FALSE;
  201. return FALSE;
  202. }
  203. }
  204. return FALSE;
  205. }
  206. BOOL CDigitalvideo::SeekTo (int nFrame)
  207. {
  208. if (m_Open){
  209. MCI_SEEK_PARMS MCISeek;
  210. MCISeek.dwTo = nFrame;
  211. if (m_Playing && !m_Pause)
  212. mciSendCommand (m_DeviceID, MCI_PAUSE, 0, NULL);
  213. if (mciSendCommand (m_DeviceID, MCI_SEEK, MCI_TO | 
  214. MCI_WAIT, (DWORD)(LPVOID) &MCISeek))
  215. return FALSE;
  216. if (m_Playing && !m_Pause)
  217. Play ();
  218. return TRUE;
  219. }
  220. return FALSE;
  221. }
  222. void CDigitalvideo::Forward (int nFrames)
  223. {
  224. if (m_Open){
  225. if (m_Playing && !m_Pause)
  226. Pause ();
  227. MCI_DGV_STEP_PARMS MCIStep;
  228. MCIStep.dwFrames = nFrames;
  229. mciSendCommand (m_DeviceID, MCI_STEP, MCI_DGV_STEP_FRAMES, 
  230. (DWORD)(LPVOID) &MCIStep);
  231. }
  232. }
  233. void CDigitalvideo::Backward (int nFrames)
  234. {
  235. if (m_Open){
  236. if (m_Playing && !m_Pause)
  237. Pause ();
  238. MCI_DGV_STEP_PARMS MCIStep;
  239. MCIStep.dwFrames = nFrames;
  240. mciSendCommand (m_DeviceID, MCI_STEP, MCI_DGV_STEP_REVERSE |
  241. MCI_DGV_STEP_FRAMES, (DWORD)(LPVOID) &MCIStep);
  242. }
  243. }
  244. int CDigitalvideo::GetSpeed (void)
  245. {
  246. if (m_Open){
  247. MCI_DGV_STATUS_PARMS MCIStatus;
  248. MCIStatus.dwItem = MCI_DGV_STATUS_SPEED;
  249. if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
  250. MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
  251. return -1;
  252. return (int) MCIStatus.dwReturn;
  253. }
  254. return -1;
  255. }
  256. void CDigitalvideo::SetSpeed (int nSpeed)
  257. {
  258. if (m_Open){
  259. MCI_DGV_SET_PARMS MCISet;
  260. MCISet.dwSpeed = nSpeed;
  261. mciSendCommand (m_DeviceID, MCI_SET, MCI_WAIT |
  262. MCI_DGV_SET_SPEED, (DWORD)(LPVOID) &MCISet);
  263. }
  264. }
  265. /*void CDigitalvideo::SetSound (BOOL bSound)
  266. {
  267. if (m_Open)
  268. {
  269. MCI_DGV_SET_PARMS MCISet;
  270. MCISet.dwAudio = MCI_SET_AUDIO_ALL;
  271. DWORD dwFlags = MCI_SET_AUDIO;
  272. if (bSound)
  273. dwFlags |= MCI_SET_ON;
  274. else
  275. dwFlags |= MCI_SET_OFF;
  276. mciSendCommand (m_DeviceID, MCI_SET, dwFlags, (DWORD)(LPVOID) &MCISet);
  277. }
  278. }
  279. BOOL CDigitalvideo::GetSound (void)
  280. {
  281. if (m_Open)
  282. {
  283. MCI_DGV_STATUS_PARMS MCIStatus;
  284. MCIStatus.dwItem = MCI_DGV_STATUS_AUDIO;
  285. if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT | 
  286. MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
  287. return FALSE;
  288. if (MCIStatus.dwReturn == MCI_ON)
  289. return TRUE;
  290. else
  291. return FALSE;
  292. }
  293. return FALSE;
  294. }*/