DirectShow在调用Stop的时候出错

Ginie Ginie 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
程序加了一个压缩的Filter,这个Filter也没做什么很多事,就是枚举出系统的压缩器,然后选中ffdshow video encoder绑定进行压缩,我单独写了个压缩已经生成好了的AVI文件,这个就没问题,但是我把这个压缩器加进来让它实时压缩采集的视频,就会在m_pMC->Stop();这里出错,报内存不可读的错误,Call stack信息为
FFDSHOW! 086cbf78()
FFDSHOW! 086c97ed()
QUARTZ! 7cfa8523()
CCaptureVideo::CaptureImagesToAVI(CString {"D:\data\0000173_wqwqwq\20110810183804.avi"}) line 157 + 20 bytes
CTHIRD::OnCapture() line 111

我不加压缩这块,就预览和采集已经实现,程序没问题,我在程序开启的时候在OnInitDialog中调用压缩Filter,Filter代码如下

//枚举压缩器
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT hr;
ICreateDevEnum *pSysDevEnum = NULL; //创建枚举器指针
pCompress = NULL;

hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void **)&pSysDevEnum); //创建枚举器

// Obtain a class enumerator for the video compressor category.
IEnumMoniker *pEnumCat = NULL;
hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat, 0); //返回枚举参数

if (hr == S_OK)
{
// Enumerate the monikers.
IMoniker *pMoniker;
ULONG cFetched;
while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK) //开始枚举压缩器
{
IPropertyBag *pPropBag;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);

// To retrieve the friendly name of the filter, do the following:
VARIANT varName;
VariantInit(&varName);

hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if (SUCCEEDED(hr))
{
CString str(varName.bstrVal);
SysFreeString(varName.bstrVal);
if(str == "ffdshow video encoder")
{
hr = pMoniker->BindToObject(0,0,IID_IBaseFilter,(void**)&pCompress);
pMoniker->Release();
break;
}

}
VariantClear(&varName);

}
pEnumCat->Release();
pMoniker->Release();
m_pGB->AddFilter(pCompress,L"Compressor"); //添加过滤器
HRESULT ret =NULL;
IPin * pSourceOut = NULL;
IPin* pCompressIn,* pCompressOut=NULL;
IAMVideoCompression * pAMCompress = NULL; //压缩参数设置
pCompressIn = FindPin(pCompress,PINDIR_INPUT) ; //查找输入引脚
pCompressOut = FindPin(pCompress,PINDIR_OUTPUT); //查找输出引脚

pCompressOut->QueryInterface(IID_IAMVideoCompression,(void**)&pAMCompress);

}

pSysDevEnum->Release();

然后在点击采集按钮的时候进行实时采集压缩,代码如下

HRESULT hr=0;
if(m_pMC)
{
m_pMC->Stop(); ////////////////////此处出现问题 }

hr = m_pCapture->SetOutputFileName( &MEDIASUBTYPE_Avi,inFileName.AllocSysString(), &pMux, NULL );

//渲染媒体,链接所有滤波器
m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pBF,pCompress,pMux);
HRESULT ret = pMux->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
pMux->Release();
m_pMC->Run();//回复视频
return hr;

就在上面的m_pMC->Stop();处出问题
我在GraphEdit里配置图表没有问题

为什么会出现这种情况啊,请高手帮帮忙,谢谢了,实在是急死了都
...全文

相关推荐

AVI视频播放

利用VC开发可以打开AVI视频,支持视频的播放、暂停,全屏播放,循环播放,代码简单易读,适合初学者

浅

Delphi XE中DSPack 2.3.3控件安装、使用与兼容性实战指南

DirectShow是Windows平台经典的多媒体处理框架,其通过Filter Graph模型将音视频处理流程模块化,实现了数据流的灵活组装与控制。这一原理为开发者提供了强大的底层媒体操作能力,其技术价值在于能够高效处理本地文件播放、实时流媒体捕捉与格式转换等复杂任务。在Delphi开发环境中,DSPack控件包作为DirectShow的封装层,将COM接口与Filter Graph的复杂性转化为可视化的VCL组件,极大地提升了开发效率,广泛应用于视频监控、会议系统、媒体播放器等桌面应用场景。本文聚焦于经

weixin_30388677

C# 通过 CSharpVLC 封装 LibVLC 实现 RTSP 视频流播放完整指南

在工业监控、上位机开发等场景中,C# 程序播放 RTSP 视频流是常见需求。RTSP 是一种实时流媒体传输协议,广泛用于海康、大华等网络摄像头。直接基于 DirectShow 或 FFmpeg 开发往往面临兼容性差、封装复杂、解码同步难等痛点。LibVLC 作为 VLC 播放器的核心引擎,内置丰富的流媒体协议解析和硬件解码能力,通过 CSharpVLC 这类托管封装库,C# 开发者可以跨过底层解码细节,快速实现视频拉流、窗口嵌入、多路预览与录制。文章围绕 VS2017 环境下的项目配置、LibVLC 运行库

weixin_33834628

Unity跨平台视频播放实战:AVPro Video双端配置与StreamingAssets路径优化

视频播放是游戏和多媒体应用中的基础功能,其核心原理在于解码与渲染。Unity原生Video Player组件在跨平台场景下常面临性能瓶颈与兼容性问题,尤其在安卓端表现不佳。为解决这一痛点,开发者常借助AVPro Video这类专业插件,它通过桥接各平台原生播放器(如Android MediaPlayer、Windows Media Foundation),充分利用硬件解码能力,显著提升播放性能与格式兼容性。在工程实践中,视频资源的加载路径处理是关键环节,特别是StreamingAssets文件夹在不同平台(

cucanqi9387

基于C#的DirectShow完整类库

基本包含了DirectShow里边大部分类的封装,便于从C#,VB面向对象的引用

_Hiro
评论 22
收藏 已收藏
分享
返回顶部
Ginie
VC/MFC 16,550 成员 421,606 内容