- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理 DirectShow 过滤器图以检索 IMediaSample
来自视频文件。不久前,我们从契约(Contract)开发人员那里收到了原始实现,我一直在用头撞墙,试图弄清楚为什么这段代码在我的开发机器上运行,但在我拥有的另外两台测试服务器上运行不正常。
据我所知,过滤器图永远不会在“损坏”的机器上完成。我总是收到 E_ABORT
来自 IMediaEvent->WaitForCompletion()
称呼。然而在“工作”机器上,这个调用通常返回 S_OK
在大约两个循环之后。
更新:
DirectShow Spy似乎不适合我。也许那是因为我们有一个未注册的自定义
(<-- 正如建议的消息泵解决了这个问题)CTransInPlaceFilter
收集
IMediaSample
在链中?没有错误,但 GraphEdit 和 GraphStudio 只是在尝试连接到远程图形时挂起。
使用 GraphStudio我能够从连接到我们的 CTransInPlaceFilter
的 MPEG-4 解码器获取媒体子类型。 .在我的机器上它是 MEDIASUBTYPE_YV12
但在“坏”机器上它是MEDIASUBTYPE_IYUV
.在CheckInputType
我们的方法CTransInPlaceFilter
我们只接受MEDIASUBTYPE_RGB24
这让我相信图中插入了一个或多个“魔法过滤器”。
更新:感谢 Roman R。我能够获得 DirectShow Spy在职的。至少在“坏”机器上。在“正常工作”的机器上,我遇到了访问冲突,但过滤器图运行很快并且被拆除,因此很难连接到它。
我还发现我们有一个能够处理 MEDIASUBTYPE_IYUV
的颜色空间转换器在MEDIASUBTYPE_RGB24
出去。我将其添加到图表中,现在应该是正确的。
DirectShow Spy将其显示为过滤图(对我来说看起来很完整):
File Source -> MPEG Demux -> MPEG4 Decoder -> Color Space Converter -> CTransInPlaceFilter -> Null Render
However the IMediaEvent->WaitForCompletion()
call never returns S_OK
and the filter graph just runs forever. So now I'm stumped as to what is going on. Is there anything else I should be checking for an error state or something?
Update: I modified the loop to enumerate the filters in the graph and query their state:
char debugString[512];
int count = 0;
long EvCode;
mediaFilter->SetSyncSource(NULL);
hr = mediaControl->Run();
sprintf(debugString, "mediaControl->Run() %d", hr);
DebugLog(debugString);
while (!m_ThreadKill)
{
hr = mediaEvent->WaitForCompletion(200, &EvCode);
sprintf(debugString, "mediaEvent->WaitForCompletion() %d, %d", hr, count);
DebugLog(debugString);
count++;
IEnumFilters *pEnum = NULL;
IBaseFilter *pFilter;
ULONG cFetched;
graphBuilder->EnumFilters(&pEnum);
while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)
{
FILTER_INFO FilterInfo;
FILTER_STATE FilterState;
char szName[256];
pFilter->GetState(200, &FilterState);
pFilter->QueryFilterInfo(&FilterInfo);
WideCharToMultiByte(CP_ACP, 0, FilterInfo.achName, -1, szName, 256, 0, 0);
sprintf(debugString, "Filter: %s, %d", szName, FilterState);
DebugLog(debugString);
SAFE_RELEASE(FilterInfo.pGraph);
SAFE_RELEASE(pFilter);
}
SAFE_RELEASE(pEnum);
if (hr == S_OK)
{
break;
}
}
sprintf(debugString, "mediaControl->Stop()");
DebugLog(debugString);
mediaControl->Stop();
都处于“Running”状态。因此,如果过滤器连接正确并且所有过滤器都在运行,为什么图形在“损坏”的机器上永远不会完成?
更新:按照 Roman R 的建议,我删除了我们的 CTransInPlaceFilter
从损坏的机器上的过滤器图和图成功完成。随着CTransInPlaceFilter
连接后 CPU 使用率降为零。所以现在我不确定为什么下面的代码在某些机器上工作而不是其他机器。我将开始向 CTransInPlaceFilter
添加一些调试日志记录尝试找出正在发生(或未发生)的事情。
解决方案: 正如 Roman R. 所建议的(我觉得我在重复自己 :P),问题最终变成了僵局。损坏的机器都有一个 CPU/内核,而工作机器有多个 CPU/内核。该应用程序由每个源视频一个线程、一个合并线程和一个目标线程组成。
源线程运行一个过滤图(我假设过滤图也在它自己的线程中运行)以从 IMediaSample
中检索数据并将其放入 CQueue<BYTE*>
.
合并线程遍历源,从源中检索样本数据 CQueue<BYTE*>
,将帧合并为单个图像,并将它们发送到 CQueue<BYTE*>
目标线程消耗。
目标线程运行另一个过滤图来对视频/音频进行编码。
CQueue<BYTE*>
在 Put 上阻塞,直到有可用空间。通常这很好,因为合并线程正在删除项目。然而,在单 CPU/核心机器上,合并线程被源线程阻塞。
长话短说 Sleep(0);
在这里和那里允许源线程屈服于合并线程,问题似乎已解决。
最佳答案
播放完成在内部包括从流源发送流结束通知,这些通知由下游过滤器中继,在渲染器上收集,然后合并,报告给应用程序。因此,成功完成取决于过滤图的所有参与者是否正确行事。
您发现了图形的拓扑结构,并且需要比较不同机器上的拓扑结构。如果您在那里看到任何差异,他们可能会建议哪个过滤器可能会丢失完成通知。
但是,即使拓扑准确匹配,某些过滤器也可能由于其他原因而采取不同的行为。特别是,在图表上使用您自己的自定义过滤器很可能会丢失通知并且图表永远不会完成。它停止处理数据并从那里闲置(这是您要检查的另一件事 - CPU 消耗是否降低到零或某些处理仍在进行,在这种情况下您可以将问题重新限定为死锁)。
您可以或多或少地轻松解决此问题的方法是开始从图表中删除过滤器,以确定哪个过滤器确实带来了问题。尝试这些图表可能会发现违规者:
File Source -> MPEG Demux -> MPEG4 Decoder -> Color Space Converter -> Null Render
File Source -> MPEG Demux -> MPEG4 Decoder -> Null Render
File Source -> MPEG Demux -> Null Render
关于c++ - DirectShow 过滤器图在某些机器上永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18257910/
有人可以解释预定义谓词forall如何在列表中找到最小值吗? 最佳答案 对于列表L,您可以使用: member(Min,L), forall(member(N,L), N>=Min). 但是,尽管这是
编辑:澄清一下,我正在搜索的对象数组确实已按搜索变量的字母数字顺序进行了预排序。 我做了一个二分搜索函数并将它嵌套在另一个函数中。出于某种原因,每次我使用二进制搜索都无法找到相关的字符数组。 基本上,
是否可以阻止用户(甚至是管理员)终止我的程序? 或者万一被杀死,它会迅速恢复自身? 更新:澄清一下:我正在编写一个监控程序,类似于家长控制,它记录用户对 PC 的操作。你可以通过查看我最近的其他问题来
我有一个 for 循环,我希望它永远递增。 我的代码: for a in (0...Float::INFINITY).step(2) puts a end 输出: 0.0 2.0 4.0 Et
我很困惑。我有一个运行Ubuntu 14.04的VM。我在这里遵循了以下程序:http://clang.llvm.org/docs/LibASTMatchersTutorial.html,现在正在运行
这是我的代码 #include #include #include #include #include #include #include #include #include usi
我有一个程序会或多或少地通过标准输入使用 COPY FROM 将大量数据复制到 Postgres 9 中。 这目前工作正常,但我正在缓冲数据 block ,然后分批运行 COPY FROM 操作。 我
我想我不小心在某个地方安装了 Foreverjs 并启动了它。每次我杀死这个进程时,另一个进程就会取代它的位置 ] 1 我不知道永远在哪里(或者这实际上是导致它的原因),因为我在本地安装了它。 最佳答
我得到了一个 forever: command not found 当我使用 forever 命令作为 cronjob 运行 nodejs 进程时出现错误(在亚马逊 ec2 机器中):我正在使用的 b
我创建了一些容器,它们还没有准备好使用,总是“重新启动”状态: docker ps CONTAINER ID IMAGE COMMAND
我试图永远重复一个 IO 操作,但是将一个执行的结果输入到下一个执行中。像这样的东西: -- poorly named iterateM :: Monad m => (a -> m a) -> a -
这里的代码样式问题。 我看着this问题,它询问.NET CLR是否真的总是初始化字段值。 (答案是肯定的。)但令我感到惊讶的是,我不确定执行此操作始终是个好主意。我的想法是,如果我看到这样的声明:
美好的一天,我对永久启动\停止脚本有一些问题。 中央操作系统 6.2 内核 2.6.32-220.el6.x86_64 node.js v0.6.19 npm v 1.1.24 永远@0.9.2 我创
我在让管道与 paramiko 一起工作时遇到问题。 这个有效: ssh = paramiko.SSHClient() [...] stdin, stdout, stderr = ssh.exec_c
我希望守护我的 Node.js 应用程序。 Upstart 和永远有什么区别?另外,还有其他我可能想要考虑的软件包吗? 最佳答案 正如评论中指出的,upstart将用于启动 forever脚本,因为
我有以下查询,其中包含在 5 秒内返回数据的选择查询。但是当我在前面添加创建物化 View 命令时,查询需要创建物化 View 。 最佳答案 当您创建物化 View 时,实际上是创建了 Oracle
当我今天访问我的项目的 Google Cloud 控制台并单击“计算引擎”或“云存储”时,它只会永远显示“正在加载”。几天前,我能够看到我的虚拟机和存储桶。有没有办法让控制台再次工作? 谢谢, 麦克风
我编写了一个函数,它当前显示 1000 以下的所有质数。 我可以继续增大 1000 以生成更多数字,但我不知道如何让它在运行后一直持续下去。 func generatePrimes() { l
这是由 another question 触发的. 具体来说,我有一个进程中的 COM 类,它在 CLSID registry 中定义。因为有 ThreadingModel of Both . 我们的
我正在试用新的 React Hooks的 useEffect API,它似乎永远在无限循环中运行!我只希望 useEffect 中的回调运行一次。这是我的引用代码: 单击“运行代码片段”以查看“运行
我是一名优秀的程序员,十分优秀!