- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图使用DirectShow连续播放两个AVI文件(一个接一个),以便当播放器从一个文件过渡到下一个文件时,音频或视频不会中断。
我在窗体上有两个自定义控件。每个接口都预加载了一个AVI文件,在播放开始之前,我设置了所有DirectShow接口,设置视频窗口并调整它们的大小,依次调用IMediaControl.Run(),IMediaControl.Pause(),IMediaSeeking.SetPositions在两个控件上均重置为帧0。在窗体上,您可以看到两个文件都在其初始帧处暂停。
然后,我在第一个控件上调用IMediaControl.Run(),并等待它完成,然后再在第二个控件上调用Run()。最初,我迷上了第一个视频的EC_COMPLETE通知消息,并使用它来启动第二个视频。考虑到该事件可能会很慢到达(事实是这样,但是出于一个奇怪的原因),我尝试了另外两种方法:
检查每秒钟关闭的计时器中的第一部视频的当前位置(使用IMediaPosition.get_CurrentPosition)。当当前位置在视频停止时间的一秒之内时(预先从IMediaPosition.get_StopTime获知),我进入一个紧密的while
循环,等待当前位置等于停止时间,然后调用Run()在第二个视频上。
与第一个相同,除了我用从while
调用timeSetEvent
替换winmm.dll
循环,并设置了延迟,以便在第一个文件应该结束时正确触发。我使用回调来运行第二个文件。
这两种方法都可以大大减少第一个文件的末尾与第二个文件的开始之间的延迟,这表明EC_COMPLETE消息在文件完成后不会立即到达(我还尝试挂钩EC_SEGMENT_COMPLETE消息,这是应该用于在文件内循环,但显然没有人支持它-至少在我的机器上从来没有发生。
通过以上所有操作,可以将转换延迟从一秒缩短到几乎无法察觉的故障;大约有三分之一的时间文件完全没有中断地过渡,这表明没有根本原因使我不能一直运行。
不幸的是,轻微的延迟仍然是无法接受的。我认为(而且我很容易错了),剩余的延迟是由于在调用IMediaControl.Run()与实际开始播放视频之间存在微小的延迟。
有人知道我能做些什么来消除这种小滞后吗?被告知这无论出于何种原因从根本上都是不可能的,这也不会让我感到惊讶。我从未在Windows中遇到没有此问题的视频播放器,因此它可能不可行。
更多信息:我正在播放的AVI文件是完全未压缩的(视频和音频是未压缩的),因此我认为延迟不是由于DirectShow不得不在播放开始之前解压缩视频,尽管它可能仍会缓冲当然(这可能是问题的根源)。尽管我会开始播放,暂停然后倒回开头将解决此问题。
另外,我处理过渡的方法是将第二个控件实际放在第一个控件的下面;当第一个完成播放时,我开始第二个播放,然后在其上调用BringToFront,从而在两个原始文件之间创建了单个视频的外观。我不认为这是由于故障造成的,因为在某些时候它可以完美工作,即使这有问题,也无法解释匹配的音频故障。
甚至更多:我只是尝试“提前”在30到50毫秒之间开始播放第二个视频,这似乎消除了更多的差距,所以我猜想Run()中的延迟大约有那么长。但是,它似乎是可变的,因此这仍然不是我需要的位置。
更重要的是:也许我可以通过从内存而不是从文件加载AVI来消除这种延迟。不幸的是,我不知道该怎么做。 IMediaControl仅具有RenderFile()
方法,而不具有RenderStream
或RenderMemory
方法。
最佳答案
如果在停止的图上调用IMediaControl :: Run,则图管理器会将调用发布到工作线程上(因此会有一些可变性)。在辅助线程上,图形将被暂停。渲染过滤器仅在接收到数据后才完成暂停过渡,因此一旦GetState()返回S_OK,图形管理器就会知道该图形已完全提示。此时,它将选择大约10ms的时间,并以该时间为起点在每个过滤器上调用Run。由于告诉每个过滤器要花时间,因此dshow Run方法具有一个参数,该参数是应播放采样时间戳为零的时钟时间-即实际过渡到运行模式的时间。
要将其与另一个图同步,首先必须确保两个图具有相同的时钟。在图形(不是过滤器)上查询IMediaFilter,然后在一个图形上调用GetSyncSource,在另一个图形上调用SetSyncSource。然后,您需要暂停第二张图,以便对其进行提示和准备。当您要启动它时,调用IMediaFilter :: Run而不是IMediaControl :: Run,您可以传递自己的开始时间。距离未来还有几毫秒,因此最好的办法可能是将第二张图的开始时间设置为第一张图的开始时间及其持续时间(对于未压缩流的索引容器,持续时间应为准确)。
另一种方法是使用多个图。将源与渲染分开将使您能够在源之间进行无缝切换,因为它们会馈入一个通用的渲染图中。 www.gdcl.co.uk/gmfbridge上有此方法的示例源代码。
G
关于directshow - 如何获取IMediaControl.Run()以开始播放文件而没有延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2469855/
我目前正在处理 Windows Media Foundation。但是,由于 Microsoft H.264 解码器的一些问题和一些缺少自定义格式的解码器,我想知道是否可以直接使用 CLSID 实例化
IMediaEvent 和 IMediaEventEx 没有说明图中哪个过滤器发送了检索到的 DirectShow 事件。有什么办法可以找到这些信息。特别是对于图中的过滤器之一发送 EC_ERRORA
我已经阅读了 DirectShow 上的 MSDN 文档,但它仍然令人困惑。我觉得我需要更多关于对象的上下文:图形、图钉、过滤器...等。谷歌搜索并没有给我太多的工作。我需要什么才能理解 Direct
正如我刚刚发现的那样,友好的名称不能保证是唯一的。如果我可以从该标识符实例化过滤器而无需枚举它们,则可加分。 最佳答案 可以通过 WaveOutId 识别包装 WaveOut 设备的渲染器过滤器。那些
我想捕获当前帧及其前一帧以进行分析并生成一个新帧来显示。是说我必须写一个变换DirectShow过滤器吗?但我是 DirectShow 的新手。我被MSDN的大量文档弄糊涂了。所以我想知道是否有任何简
enter code here我必须动态停止和启动 Video Renderer Filter。在不创建新图表的情况下,使用“普通”直接展示架构是不可能的。但是使用 GMFBridge 似乎是可能的。
在网上搜索了几个小时后,我非常想找到解决方案。我已经在 DirectShow 中启动并运行 OGG Theora 解码器,它输出 YV12 和 YUY2 颜色模型。 现在,我想为这个输出制作一个 RG
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
长篇故事: 有一个 H264/MPEG-4 源 我可以用 RTSP 协议(protocol)连接这个源。 我可以使用 RTP 协议(protocol)获取原始 UDP 数据包。 然后将这些原始 UDP
这可能是一个愚蠢的问题,但我很难概念化我需要在这里做什么......过去我使用 DirectShow 连接到相机并使用源过滤器捕获 AVI,AVI多路复用器、压缩过滤器、运行图表等……小菜一碟。在这种
我有一些自定义 DirectShow 过滤器(用于编码/解码/多路复用/多路分离)。 我想在 Media Foundation 上将它们用作 MFT。 我听过一些人说: “微软声称所有 DirectS
我做了一个简单的图表来编写 MKV 文件。但我不想使用文件编写器。我想使用 SampleGabber 并使用简单的程序获取流。问题是我从 Matroska muxer 以外的任何地方获取数据!(我该怎
我正在使用使用 DirectShow 库的 WPF 应用程序,它可以很好地抓取图像或记录实时提要,但我希望最终用户不应该看到任何网络摄像头正在拍照,即我想要用户不应看到正在呈现来自网络摄像头的提要的图
我应该写一个直接显示过滤器 从实时源获取输入(视频、音频)。 它应该将数据(视频,音频:已编码)提供给解码器过滤器 MyCustomDirectShowSourceFilter ---> Decode
我在从 DirectShow 筛选器图表编辑器连接到远程图表时遇到问题。当我运行创建直接显示图形的应用程序时,在我的 Windows XP 计算机上,图形显示在远程图形列表中,但在 Windows 7
什么是微软的 DirectShow ,以及它与以下内容有何关系: 编解码器? 容器? 编解码器和容器之间的确切区别是什么? 最佳答案 用简单的英语: 编解码器是一种算法和/或代码,可将音频或视频从 R
我开发了一个使用 DirectShow 从外部设备捕获视频的 Windows 应用程序。图像分辨率为 640x480,未经压缩保存的视频尺寸非常大(大约每秒 27MB)。 我的目标是尽可能地减小这个大
我正在尝试用 C# 制作一个允许用户录制视频的网络摄像头应用程序。我一直在使用 DirectShow.Net 来预览网络摄像头并拍摄快照。但需要能够在预览网络摄像头的同时捕捉视频和音频。我尝试过的一件
我已经找了很长时间,但是找不到解决方案。 如何从USB(符合Directshow规范)输入设备捕获音频并直接传递到PC扬声器(“音频渲染器”)? 我相信这不是一项艰巨的任务,但是我确实在网络上找不到任
我正在从我的应用程序执行 VLC 以从 DirectShow 音频捕获设备捕获和编码。 VLC 通过 STDOUT 将编码数据发送到我的应用程序。我需要一种枚举 DirectShow 音频捕获设备的方
我是一名优秀的程序员,十分优秀!