DirectShow功能在系统启动时被阻止
DIrectshow function is blocked at system bootup
我有一个基于直接表演的MediaPlayer应用程序。在普通游戏期间,它效果很好,没有任何问题。但是有时候,当Mediaplayer在系统启动后开始时,我会面临一个问题。
HRESULT CSDirectShow::RenderOutputPins (IBaseFilter* pFilter)
{
const char* funcName = "CSDirectShow::RenderOutputPins()";
HRESULT hr = S_OK;
// Enumerate all pins on the source filter,
// looking for the output pins so that I can call Render() on them
//
CComPtr< IEnumPins > pEnumPin;
if (!FAILED (pFilter->EnumPins (&pEnumPin)))
{
while (true)
{
// get the next pin
//
CComPtr< IPin > pPin;
if (pEnumPin->Next (1L, &pPin, NULL) != S_OK) break;
// I'm not interested in connected pins
// if this pin is an unconnected output pin, then render it.
//
CComPtr< IPin > pConnectedPin;
if (pPin->ConnectedTo (&pConnectedPin) == VFW_E_NOT_CONNECTED)
{
PIN_DIRECTION pinDirection;
PIN_INFO pinInfo;
//Get the information of the pin
if (pPin->QueryDirection (&pinDirection) == S_OK
&& pinDirection == PINDIR_OUTPUT
&& pPin->QueryPinInfo(&pinInfo) == S_OK
&& strstr((char*)pinInfo.achName,"~")==NULL)
{
if (FAILED (hr = m_pGB->Render (pPin)))
{
SafeRelease(&pinInfo.pFilter);
return hr;
}
}
SafeRelease(&pinInfo.pFilter);
}
}
}
TraceMsg ("%s: exit",funcName);
return S_OK;
}
当调用 m_pgb->渲染(ppin(时,此函数永远不会返回,并且它被阻止内部。我使用日志确认了。此问题仅在我启动时发生启动后立即使用我的应用程序。当我关闭并重新启动应用程序时,出现问题时,它的工作就像魅力一样。由于应用程序旨在在系统启动后自动启动此行为已成为更大的问题。
IGraphBuilder.Render
呼叫在内部进行了很多操作,具体而言,它会枚举潜在合适的过滤器,进而尝试加载在DirectShow环境中注册的其他DLL。此类文件可能缺少依赖关系,或者对远程或暂时无法访问的驱动程序的依赖项(仅一个示例(。
如果您遇到僵局,则可以对其进行进一步解决(调试(并获取有关锁定状态的详细信息以及在渲染呼叫期间的活动。
如果问题是由第三方过滤器引起的(尤其是编解码器包装,立即注册过滤器的集合而不考虑兼容性太多(,以不太好的方式注册,也许您可以识别它们并卸载它们。
如果您想改善播放器,则应避免呈现呼叫,并以较小的增量构建滤波器图 - 添加特定的过滤器和连接销,而无需在智能连接的Mercy中留下重大任务,这在一般但对兼容性问题很敏感。
相关文章:
- 文件系统:复制功能的速度秘诀是什么
- 如何在现代C++中实现没有宏的系统特定功能
- 具有文本角色扮演功能的移动系统
- 系统错误:程序无法启动,因为您的计算机中缺少MSVCP140D.DLL。尝试重新安装该程序以解决此问题
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- "configure"脚本如何检测我的系统是否支持某些头文件或 cpp 功能?
- Qt/C++ 系统单元启动/停止时的信号
- Boost进程"系统"功能中的错误处理
- 如果在创建对象时创建了 VPTR,那么为什么具有虚拟功能的类的大小在 32 位系统上为 4,在 64 位机器上为 8
- 如何制作一个根据拉取请求关闭和打开功能的构建系统?
- 如何让线程继续并启动其他功能 - C++使用 OpenMP?
- 是否可以在系统中使用"espeak"(" ");功能?
- 检查程序是手动调用还是通过系统启动调用
- 如何在跨平台C++中以毫秒为单位获得系统启动/启动时间(它应该在Windows / IOS / Android / MA
- DirectShow功能在系统启动时被阻止
- QTimer启动功能究竟发生了什么
- 按键启动功能
- 进程启动功能
- 在系统启动时从注册表读取文件[c++]