下面的代码使用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);
# endif
hFile =它仅仅(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);
如果(失败(人力资源)
转到错误;
/ /得到VIDEOINFOHEADER
hr = 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);
}
帮助收藏
光栅net|C API|c++类库|HTML5 JavaScript
文档net|C API|c++类库|HTML5 JavaScript
医疗net|C API|c++类库|HTML5 JavaScript
医疗Web查看器net
188宝金博怎么下载
支持的平台上
net, Java, Android和iOS / macOS组件
C / c++类库的API
HTML5 JavaScript库
你的邮件已经发送到支持!有人应该联系!如果你的问题是紧急请回到聊天。
聊天时间:
周一——周五,上午6点等
谢谢你的反馈!
请填写表单重新开始一个新的聊天。
所有代理目前离线。
聊天时间:
周一-周五
早上8:30 - 6点
联系我们请填写这张表格,我们将通过电子邮件联系你。