天天看点

[转载]vfw的AVI族函数读取AVI文件

#include "vfw.h"

#pragma comment(lib, "vfw32.lib")
#pragma comment(lib, "Winmm.lib")

	AVIFileInit();
	PAVIFILE pAviFile = nullptr;
	// 打开AVI文件 
	int nRet = AVIFileOpen(&pAviFile, "10.82.27.20_00_201908231542_part0.avi", OF_READ, NULL);

	if (nRet == 0)
	{
		// 读取AVI文件的信息
		AVIFILEINFO aviFileInfo = { 0 };
		AVIFileInfo(pAviFile, &aviFileInfo, sizeof(AVIFILEINFO));

		// 提取出AVI文件的某种流,此例为视频流
		PAVISTREAM pAviStrem = nullptr;
		AVIFileGetStream(pAviFile, &pAviStrem, streamtypeVIDEO, 0);

		// 读取流信息
		AVISTREAMINFO aviStreamInfo = { 0 };
		AVIStreamInfo(pAviStrem, &aviStreamInfo, sizeof(AVISTREAMINFO));
		/*
		// type 为流格式(音频或视频),handler为压缩方法:如H264
		char handler[4],type[4];
 		handler[0] = stinfo.fccHandler;
 		handler[1] = stinfo.fccHandler >> 8;
		 handler[2] = stinfo.fccHandler >> 16;
		 handler[3] = stinfo.fccHandler >> 24;
 		type[0] = stinfo.fccType;
		type[1] = stinfo.fccType >> 8;
 		type[2] = stinfo.fccType >> 16;
		type[3] = stinfo.fccType >> 24;
		//如果是压缩的视频(一般都是压缩的),打开读取压缩桢的函数
		PGETFRAME pGetFrame = AVIStreamGetFrameOpen(pAviStrem, NULL);
		//返回解压缩后,图像的信息
		LPBITMAPINFOHEADER lpbm = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pGetFrame, 1);
		//读入并解压缩视频的每一帧
		for (int i = 0; i < aviFileInfo.dwLength; i++)
		{
			memcpy(RGBbuf,(BYTE*)AVIStreamGetFrame(pgf,i)+40,pfi.dwWidth*pfi.dwHeight*3);
		}
		//关闭读取压缩桢的函数
		AVIStreamGetFrameClose(pGetFrame);*/

		char* szBuf = new char[500 * 1024];
		memset(szBuf, 0, 500 * 1024);

		const int headerSize = sizeof(CMD_HEADER) + sizeof(AV_VIDEO_INFO);
		while (!m_bExit)
		{
			for (int i = 0; i < aviFileInfo.dwLength; i++)
			{
				// 获取编码前数据
				AVIStreamRead(pAviStrem, i, 1, szBuf + headerSize, 500 * 1024 - headerSize, NULL, NULL);
			}
		}
		//释放AVI文件指针
		AVIFileRelease(pAviFile);
	}

	AVIFileExit(); 
           

继续阅读