使用 Stream Buffer 引擎 - Windows XP Service Pack 1 上的 TIME SHIFT






3.64/5 (5投票s)
2004年6月3日
6分钟阅读

129194

3011
新一代采集设备 - 支持时光平移的 MPEG2 采集。
引言
本文仅指带有 Service Pack 1 的 Microsoft Windows XP。SBE.dll 将仅存在于安装了 DirectShow 9 和 Service Pack 1 的 Windows XP 中。SBE 的文档可在 Microsoft 找到。
新一代采集设备(旧设备是原始采集设备)包含 MPEG1,2 硬件编码器。如今,采集设备分为两大类:
- 原始采集设备 -> 视频渲染器
- MPEG2 采集设备 -> MPEG2 解复用器 -> MPEG2 视频解码器 -> 视频渲染器。
原始采集设备(电视调谐器板)和 MPEG2 采集设备之间的一个巨大差异是图表编辑和渲染能力。任何 USB 摄像设备、电视调谐器采集设备(WDM 采集设备)都可以通过简单地将设备添加到图中,然后尝试渲染其输出引脚(采集引脚或预览引脚)来构建到图中。
例如 - 原始采集设备
直到今天(本文发布时),几乎所有第三方应用程序,甚至 Microsoft Windows Movie Maker (WMM)、MSN Messenger、Yahoo Messenger 等,都不支持在其软件中为 MPEG2 设备构建图表。(我希望,在他们阅读本文后,每个人都会添加它。)
MPEG2 图表示例将如下所示:
今天,您可以通过两种不同的方式在计算机上观看电视:
- 使用电视调谐器原始采集设备。
- 使用 MPEG 采集设备。
使用 MPEG2 采集设备比原始采集设备具有多项优势。其中之一是能够使用 SBE.dll(流缓冲区引擎)的最新时光平移技术。
流缓冲区引擎 – 时光平移。
此 DLL 中的两个过滤器能够构建一个特殊图表,让您可以在计算机上进行时光平移。时光平移是指在电影始终被录制到文件中的同时停止电影预览的能力。这让您可以在自己的时间观看电视节目,而不会错过电影的一秒钟。
..在我们深入研究源代码之前还有一步。
两点说明:
- SBE Sync 将 MPEG2 程序流的复用转换为 ASF。因此,结果是源图使用不同的源 – 流缓冲区源。
图表编辑工具中的流缓冲区源和流缓冲区引擎.
流缓冲区源图表示例
- 时光平移同步引擎在您的一个硬盘的系统隐藏目录下,在 TEMP_SBE 目录下创建文件。
文件具有 .tmp 扩展名。
要在应用程序外部的 Windows XP 下播放这些文件,您应该执行以下操作:
- 将文件扩展名转换为 dvr-ms 扩展名。
- 下载(如果您尚未下载)Microsoft 网站上的一个补丁,该补丁修复了此 SBE.DLL 中的音频问题。( Q810243_WXP_SP2_x86_ENU.exe)
示例代码
此代码的第一个版本将使用 MPEG2 硬件设备实现时光平移。
代码包含以下类:
CSBESource
CSBESync
CDirectShowGraph
流缓冲区图表作为两个构建图表工作,一个用于采集设备,一个用于预览。CSBESync
是 WDM MPEG 采集设备的图表,而 CSBESource
是播放器图表。
CSBESync
正在构建以下图表:
代码展示了如何使用 CDirectShowGraph::AddMpeg2Demultiplex
中的代码配置 MPEG2 解复用器。
源和同步这两个类手动构建两个图表,包括选择 MPEG2 视频解码器,以及为什么我认为最好手动配置而不是仅仅渲染。这确保了图表能够连接,并验证了组件在系统中。根据经验,渲染大部分时间不起作用,有时渲染失败,而使用手动连接则成功。有时甚至计算机因糟糕的视频解码器(例如硬件解码器)而崩溃。
在您的应用程序中使用代码
SBESyncHandler = new CSBESync(this); try { SBESyncHandler->Preview(); } catch (int v) { AfxMessageBox("Error in preview"); } pWindow = new CActiveWindowDlg (this); pWindow->Create(IDD_ACTIVE_WINDOW_DLG , this); SBESourceHandler = new CSBESource(this); try { SBESourceHandler->SetVideoWindow(pWindow->GetSafeHwnd()); SBESourceHandler->PlaySync(SBESyncHandler->dsGraph->pStreamBufferSyncInterface, SBESyncHandler->dsGraph->pStreamBufferSyncFilter); } catch (int v) { AfxMessageBox("Error in preview"); } SBESyncHandler->Run(); Sleep(100); pWindow->ShowWindow(SW_SHOW); SBESourceHandler->Run();
更多要点..
- 您可以轻松创建不同的音频或视频解码器类,将
eVideoDecoder
或mAudioDecoder
复制到不同的名称并更改类名。然后,更改
CLSID
和引脚名称。这不是一项无限的工作,音频和视频解码器不是太多。以下是列表:Microsoft Audio Decoder、CyberLink、Elecard (Moonlight)、InterVideo、Ligus。 - 如果现有 SBE 图表未正确,例如 SHIFT+F5,或者检测到错误且应用程序未正确退出,Windows 将开始大量移动鼠标并需要重新启动。因此,在调试 SBE 图表应用程序时,不要留下任何打开的文件、应用程序或文档,因为如果出现问题,您将无法关闭它们并可能丢失数据。
播放 DVR-MS 文件。
流缓冲区引擎的输出文件基本上是 MPEG2 视频 + MPEG 音频复用到 ASF 中。流缓冲区同步实时将 MPEG2 程序流转换为 ASF(在这里,我想问为什么 Microsoft 没有提供一个选项将其保留为程序流,因为如果您想将 MPEG2 文件刻录到 DVD,它会变得复杂)。有一个选项可以在任何 Windows XP 机器上单独播放这些文件。为此,您需要执行以下几个步骤:
- 下载 Microsoft Windows Media Player 9 - (如果您希望在 WMP 下播放)
- 下载 Microsoft 针对此特定问题的最新修补程序 此处 (Windows XP SP1 更新:在其他 Windows XP 电脑上观看由 Media Center 电脑录制的电视节目)。
- 将文件名更改为 DVR-MS 扩展名,而不是 MPEG 或 tmp(因为它会自动保存为此扩展名)。
然后,您可以按照本文档中描述的构建自己的图表,或者在 Windows Media Player 9 中播放。再次强调,只有在将其更改为 DVR-MS 后,Windows Media Player 才会正确播放。
使用这些类播放 DVR-MS 文件
pWindow = new CActiveWindowDlg (this); pWindow->Create(IDD_ACTIVE_WINDOW_DLG , this); SBESourceHandler = new CSBESource(this); try { SBESourceHandler->SetVideoWindow(pWindow->GetSafeHwnd()); SBESourceHandler->PlayFile(name); } catch (int v) { AfxMessageBox("Error in PlayFile"); dsDelete(); return ; } pWindow->ShowWindow(SW_SHOW); SBESourceHandler->Run();
还有..
我正在使用 CActiveWindowDlg
类来托管视频窗口。此类封装在 CBitmapButton
类之下,该类是一个完整皮肤对话框位图类(我想它是多年前从 The Code Project 获取的)。
反馈和改进
请在下面的论坛中发表评论、问题和故事,以便所有人受益。我将尝试关注论坛。如果我有一段时间没有查看论坛,请随时给我发送帖子副本或提醒。
请随时将您的补丁和改进发送至 support@becapture.com。如果它们符合项目范围,我将整合它们,感谢您的工作,并将更新后的项目发布在此页面上供大家使用。
如果我看到参与度和良好的反馈和请求,我将提交更多版本。
目标
我的主要目标是推动 MPEG2 采集设备,并说服许多软件制造商支持在其软件中构建 MPEG2 图表。毕竟,MPEG2 WDM 采集设备与 USB 摄像机和 WDM 电视调谐器属于同一类别,但它尚未在 DVD 创作软件、Windows Movie Maker 等中得到支持。
配置文件
我的个人资料是 我的主页。