DirectShow 切割视频保存到本地
来源:互联网 发布:网络语fl是什么意思 编辑:程序博客网 时间:2024/06/10 02:31
DES对于视频的拼接和拼接后视频的预览书上都有讲到,但是对于拼接后视频保存到本地的代码却是哪也找不到(自己搜索过很久)
保存到本地的关键一段代码就是找到压缩器,这段代码书上只说了大概的思路,如果你不使用压缩器直接用书上的代码的话,截取下来的视频画面将严重失真。
void CXunLeiPlayDlg::WriteFile(IAMTimeline *pTL){IRenderEngine *pRenderEngine=NULL;CoCreateInstance(CLSID_RenderEngine,NULL,CLSCTX_INPROC_SERVER,IID_IRenderEngine ,(void**)&pRenderEngine);IMediaControl *pMC=NULL; IMediaEvent *pEvent=NULL; IGraphBuilder *pGraph; ICaptureGraphBuilder2 *pBuilder=NULL;HRESULT hr=pRenderEngine->SetTimelineObject(pTL);hr=pRenderEngine->ConnectFrontEnd();hr=pRenderEngine->GetFilterGraph(&pGraph);hr=CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **)&pBuilder); ASSERT(SUCCEEDED(hr)); hr=pBuilder->SetFiltergraph(pGraph); ASSERT(SUCCEEDED(hr)); IBaseFilter *pMux; hr=pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,L"流年逝水.avi",&pMux,NULL); ASSERT(SUCCEEDED(hr)); long NumGroups; pTL->GetGroupCount(&NumGroups); for (int i=0;i<NumGroups;i++) { IPin *pPin=NULL; if (pRenderEngine->GetGroupOutputPin(i,&pPin)==S_OK) { IBaseFilter *pCompressor=NULL;pCompressor=GetCompressor(CLSID_VideoCompressorCategory,"Microsoft Video 1"); //获取压缩器pGraph->AddFilter(pCompressor,L"com");//加入过滤器hr=pBuilder->RenderStream(NULL,NULL,pPin,pCompressor,pMux); ASSERT(SUCCEEDED(hr));pPin->Release(); } } pGraph->QueryInterface(IID_IMediaEvent,(void**)&pEvent); pGraph->QueryInterface(IID_IMediaControl,(void**)&pMC); pMC->Run(); long evCode;pEvent->WaitForCompletion(INFINITE,&evCode);pMC->Stop();}IBaseFilter* CXunLeiPlayDlg::GetCompressor(GUID inCategory, const char *inFriendlyName){ICreateDevEnum * enumHardware = NULL;HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_ALL,IID_ICreateDevEnum, (void**)&enumHardware);if (FAILED(hr)){return NULL;}IBaseFilter * hardwareFilter = NULL;IEnumMoniker * enumMoniker = NULL;hr = enumHardware->CreateClassEnumerator(inCategory,&enumMoniker,0);if (enumMoniker){enumMoniker->Reset();ULONG fetched = 0;IMoniker * moniker = NULL;char friendlyName[256];while (!hardwareFilter &&SUCCEEDED(enumMoniker->Next(1,&moniker,&fetched))&&fetched){if (moniker){IPropertyBag * propertyBag = NULL;VARIANT name;friendlyName[0] = 0;hr = moniker->BindToStorage(0,0,IID_IPropertyBag,(void **)&propertyBag);if (SUCCEEDED(hr)){name.vt=VT_BSTR;hr = propertyBag->Read(L"FriendlyName",&name,NULL);}if (SUCCEEDED(hr)){WideCharToMultiByte(CP_ACP, 0, name.bstrVal, -1,friendlyName, 256, NULL, NULL);if (strcmp(friendlyName,inFriendlyName) == 0) {moniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&hardwareFilter);}}if (propertyBag){propertyBag->Release();propertyBag = NULL;}moniker->Release();}}enumMoniker->Release();}enumHardware->Release();return hardwareFilter;}
- DirectShow 切割视频保存到本地
- Directshow视频采集保存
- android 视频录制 保存到本地
- [Android]从视频流读取帧图像保存到本地
- [opencv]5.获取视频流并保存到本地
- android前置竖屏摄像头录制视频保存到本地
- FFmpeg解码视频帧为jpg图片保存到本地
- YOLO——保存处理后的视频到本地
- Directshow采集到的视频BYTE数据转成IplImage数据并保存出去
- 如何保存微信视频到本地,微信朋友圈怎么发本地的视频。
- DirectShow 视频录制保存为avi文件
- 使用DirectShow捕获视频,并截图保存
- 保存图片到本地
- 图片保存到本地
- Bitmap保存到本地
- Javascript 保存到本地
- 图片保存到本地
- 保存文件到本地
- C# 调色板源码
- PRO*C/C++ 调用PL/SQL,存储过程
- ubuntu上卸载DEB文件
- 简单计算器程序
- 整数表示为最大子序列与整数表示为连续子序列
- DirectShow 切割视频保存到本地
- VC6下开发OCCI程序的环境配置
- ffmpeg 和 SDL 教程
- Hibernate学习笔记
- Lisp语言:如何在hash table中使用字符串作为关键字(key)?
- 学习中的英语单词 二 ---菜鸟录
- 下载安装ROS其它的Package包
- const引用形参
- 网络编程