把一个AVI文件分解为多个位图使用ltmmSampleTarget C

下面的代码使用ltmmSampleTarget和ltmmConvert生成多个从一个AVI文件与设备无关的位图。

/ /定义辅助宏使用接口下C的ifndef COBJMACROS#定义COBJMACROS# endif/ /多媒体工具包包括铅头188宝金博怎么下载# include“ltmm.h”/ /包含amvideo。h VIDEOINFOHEADER,可在Visual Studio 6.0或举SDK# include < amvideo.h >/ /包含字符串处理# include < tchar.h ># include < wchar.h ># include < string.h ># include < stdio . h >/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // / SaveBMP24/ /保存位图文件(仅支持24 BPP)/ / pszFile -输出文件名/ / pHeader - BITMAPINFOHEADER/ / pBits -位图图像数据/ /BOOL SaveBMP24 (LPCWSTR pszFile BITMAPINFOHEADER * pHeader,无效* pBits){处理hFile;TCHAR szFile [MAX_PATH];BITMAPFILEHEADER bfh;DWORD nWritten;#如果定义(_UNICODE)wcscpy (szFile pszFile);#其他的WideCharToMultiByte (CP_ACP, 0 pszFile 1 szFile MAX_PATH, NULL, NULL);# endifhFile =它仅仅(szFile GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);如果(hFile = = INVALID_HANDLE_VALUE)返回虚假的;bfh。bfType = 0 x4d42;bfh。bfOffBits =运算符(bfh) + pHeader - > biSize;bfh。bfSize = bfh。bfOffBits + pHeader - > biSizeImage;bfh。bfReserved1 = 0;bfh。bfReserved2 = 0;如果(!WriteFile (hFile &bfh,运算符(bfh) &nWritten NULL) | | nWritten ! =运算符(bfh)){CloseHandle (hFile);返回虚假的;}如果(!WriteFile (hFile、pHeader pHeader - > biSize, &nWritten, NULL) | | nWritten ! = pHeader - > biSize){CloseHandle (hFile);返回虚假的;}如果(!WriteFile (hFile、pBits pHeader - > biSizeImage, &nWritten, NULL) | | nWritten ! = pHeader - > biSizeImage){CloseHandle (hFile);返回虚假的;}CloseHandle (hFile);返回真正的;}/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // / SplitAvi/ /将一个avi文件分为个人BMP文件/ / pszAviFile -源文件的名字/ / pszOutputDir -输出BMP文件的目录(BMP格式分裂吗?)/ / nMaxFrames - BMP文件的最大数量(帧)来生成/ /HRESULT SplitAvi (LPCWSTR pszAviFile, LPCWSTR pszOutputDir,intnMaxFrames){HRESULT人力资源;IltmmConvert * pConvert =零;IltmmSampleTarget * pSampleTarget =零;IltmmMediaTypeDisp * pMediaType =零;IltmmMediaSampleDisp * pMediaSample;varFormat变体;varBuffer变体;VIDEOINFOHEADER * pVIH;无效* pbuf;型型;intn;WCHAR szFile [MAX_PATH];/ /初始化COM库hr = CoInitialize(空);如果(失败(人力资源)转到错误;/ /创建对象转换hr = CoCreateInstance (&CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER &IID_IltmmConvert (无效* *)&pConvert);如果(失败(人力资源)转到错误;/ /创建目标对象hr = CoCreateInstance (&CLSID_ltmmSampleTarget, NULL, CLSCTX_INPROC_SERVER &IID_IltmmSampleTarget (无效* *)&pSampleTarget);如果(失败(人力资源)转到错误;/ /创建媒体类型的对象hr = CoCreateInstance (&CLSID_ltmmMediaType, NULL, CLSCTX_INPROC_SERVER &IID_IltmmMediaTypeDisp (无效* *)&pMediaType);如果(失败(人力资源)转到错误;/ /设置MEDIATYPE_Video类型型= SysAllocString (L”{73646976 - 0000 - 0010 - 8000 - 00 - aa00389b71}”);hr = IltmmMediaTypeDisp_put_Type (pMediaType型);SysFreeString(型);如果(失败(人力资源)转到错误;/ /设置MEDIASUBTYPE_RGB24亚型型= SysAllocString (L“{e436eb7d - 524 f - 11 - ce - 9 - f53 - 0020 af0ba770}”);hr = IltmmMediaTypeDisp_put_Subtype (pMediaType型);SysFreeString(型);如果(失败(人力资源)转到错误;/ /设置接受媒体类型hr = IltmmSampleTarget_SetAcceptedMediaType (pSampleTarget pMediaType);如果(失败(人力资源)转到错误;IUnknown_Release (pMediaType);pMediaType =零;# ifdef _DEBUG/ /把它弄回来进行调试hr = IltmmSampleTarget_GetAcceptedMediaType (pSampleTarget &pMediaType);如果(失败(人力资源)转到错误;IUnknown_Release (pMediaType);pMediaType =零;# endif/ /设置转换输入文件的名字= SysAllocString型(pszAviFile);hr = IltmmConvert_put_SourceFile (pConvert型);SysFreeString(型);如果(失败(人力资源)转到错误;/ /设置转换对象的目标hr = IltmmConvert_put_TargetObject (pConvert (IUnknown *) pSampleTarget);如果(失败(人力资源)转到错误;/ /启动转换hr = IltmmConvert_StartConvert (pConvert);如果(失败(人力资源)转到错误;/ /获得连接媒体类型hr = IltmmSampleTarget_GetConnectedMediaType (pSampleTarget &pMediaType);如果(失败(人力资源)转到错误;/ /得到VIDEOINFOHEADERhr = IltmmMediaTypeDisp_get_Format (pMediaType &varFormat);如果(失败(人力资源)转到错误;hr = SafeArrayAccessData (V_ARRAY (&varFormat), (无效* *)&pVIH);如果(失败(人力资源){VariantClear (&varFormat);转到错误;}(n = 0;n < nMaxFrames;n + +){/ /获取样本1000年hr = IltmmSampleTarget_GetSample (pSampleTarget &pMediaSample);如果(失败(人力资源)| | ! pMediaSample)打破;/ /访问图像碎片hr = IltmmMediaSampleDisp_get_Buffer (pMediaSample &varBuffer);如果(失败(人力资源){IUnknown_Release (pMediaSample);转到converterror;}hr = SafeArrayAccessData (V_ARRAY (&varBuffer) &pBuffer);如果(失败(人力资源){VariantClear (&varBuffer);IUnknown_Release (pMediaSample);转到converterror;}/ /保存图片sprintf (szFile“% ssplit % u.bmp”、pszOutputDir n + 1);如果(!SaveBMP24 (szFile &pVIH - > bmiHeader, pbuf)){SafeArrayUnaccessData (V_ARRAY (&varBuffer));VariantClear (&varBuffer);IUnknown_Release (pMediaSample);hr = E_FAIL;转到错误;}SafeArrayUnaccessData (V_ARRAY (&varBuffer));VariantClear (&varBuffer);IUnknown_Release (pMediaSample);}/ /停止hr = IltmmConvert_StopConvert (pConvert);如果(失败(人力资源)转到converterror;/ /清理并退出hr = S_OK;converterror:SafeArrayUnaccessData (V_ARRAY (&varFormat));VariantClear (&varFormat);错误:如果(pConvert)IUnknown_Release (pConvert);如果(pSampleTarget)IUnknown_Release (pSampleTarget);如果(pMediaType)IUnknown_Release (pMediaType);CoUninitialize ();返回人力资源;}无效SplittingAVIFileIntoMultipleBitmapsUsingltmmSampleTarget_Example (){SplitAvi ((OLECHAR *) MAKE_MEDIA_PATH (“count.avi”)、(OLECHAR *) MAKE_MEDIA_PATH (”“),10);}

LEADTOOLS多188宝金博怎么下载媒体C API的帮助
188金宝搏的网址客服|支持|联系我们|知识产权的通知
©1991 - 2021领先的技术公司。保留所有权利。