Last updated: 2026年1月
Video Capture SDK .NET vs Medialooks MFormats SDK
管道引擎 vs 基于帧的采集对比
在 VisioForge Video Capture SDK .NET 和 Medialooks MFormats SDK 之间选择,是在两种根本不同的架构模型之间做出决定。Video Capture SDK 使用基于管道的引擎,您可以声明式地配置源、处理和输出,而 MFormats 遵循基于帧的抓取-处理-输出循环,您需要手动拉取每一帧并进行路由。本指南比较了架构、功能、平台支持、定价和实际代码,帮助您为项目做出正确的选择。
执行摘要
| 方面 | Video Capture SDK .NET | MFormats SDK |
|---|---|---|
| 架构 | 双引擎:原生 DirectShow/Media Foundation + 内嵌 FFmpeg 管道 | 基于帧的抓取-处理-输出循环,使用 COM 对象 |
| 平台支持 | Windows、macOS、Linux、Android、iOS(5个平台) | 仅 Windows |
| 定价 | 250-500 欧元/年(订阅)或 1,500 欧元团队/永久许可证 | 约 4,508 美元/开发者/年(订阅强制) |
| 最适合 | 跨平台采集应用、多输出管道、视频特效、检测 | 多厂商 SDI 广播、HTML5 CG 叠加、播放列表/播出工作流 |
| SDI 硬件 | Blackmagic DeckLink 支持 | Blackmagic、AJA、Bluefish444、Deltacast 多厂商 SDI |
| UI 框架 | WinForms、WPF、MAUI、Avalonia、Uno、Console、Blazor | WinForms、WPF、Console |
| 许可模式 | 永久许可或年度订阅;过期后仍可使用 | 仅年度订阅;订阅过期后添加水印 |
| 支持 | 专用工单系统,优先 SLA | 电子邮件支持,论坛 |
架构深度分析
Video Capture SDK .NET 架构
Video Capture SDK 采用基于管道的设计。您声明式地配置源、处理阶段和输出。引擎自动组装内部过滤器图,处理线程、同步和缓冲区管理。双引擎封装了用于原生设备访问的 DirectShow/Media Foundation 和用于高级编解码器及 IP 摄像头接入的内嵌 FFmpeg 管道。
- ▶声明式管道配置:设置属性,调用 StartAsync()
- ▶双引擎:原生 OS 采集 API + 内嵌 FFmpeg
- ▶通过 Direct3D / OpenGL 渲染器实现 GPU 加速预览
- ▶支持 .NET async/await 的事件驱动架构
- ▶具有自动线程管理的单进程模型
- ▶一个管道多输出:同时录制 + 流式传输 + 截图
MFormats SDK 架构
MFormats 使用基于 COM 对象构建的基于帧的抓取-处理-输出模型。您创建 MFReader 来抓取帧,通过 MFTransform 对象处理每一帧,并将它们发送到 MFWriter 或 MFRenderer 输出。这提供了逐帧的精细控制,但需要您编写采集循环、管理线程和手动处理帧时序。
- ▶基于帧的循环:从 MFReader 抓取帧,处理,发送到 MFWriter
- ▶基于 COM 的架构,带有 .NET 互操作包装器
- ▶需要手动线程和帧时序管理
- ▶逐帧控制允许自定义路由逻辑
- ▶每个管道阶段使用单独的对象(Reader、Transform、Writer、Renderer)
- ▶为广播工作流提供内置的播出和播放列表调度
关键架构差异
| 方面 | Video Capture SDK | MFormats SDK |
|---|---|---|
| 编程模型 | 声明式管道:配置并启动 | 命令式循环:逐帧抓取、处理、输出 |
| 线程 | 自动内部线程管理 | 开发者管理采集循环线程 |
| 帧路由 | 通过管道配置自动完成 | 在代码中逐帧手动路由 |
| 多输出 | 一个管道内置同时输出 | 开发者克隆帧并路由到多个写入器 |
| 平台 | 跨平台(.NET 6-10、MAUI) | 仅 Windows(基于 COM) |
| 对象模型 | 纯 .NET 托管 API | 带有 .NET 包装器的 COM 互操作 |
逐项功能对比
采集源
| 功能 | Video Capture SDK | MFormats SDK |
|---|---|---|
| USB 摄像头 | ✅ | ✅ |
| 屏幕/桌面采集 | ✅ | ✅ |
| IP 摄像头(RTSP/ONVIF) | ✅ | ✅ |
| Blackmagic DeckLink SDI | ✅ | ✅ |
| AJA SDI 卡 | ❌ | ✅ |
| Bluefish444 SDI 卡 | ❌ | ✅ |
| Deltacast SDI 卡 | ❌ | ✅ |
| 电视调谐器(BDA/DVB) | ✅ | ❌ |
| NDI 源 | ✅ | ✅ |
| 工业相机(GenICam/GigE Vision) | ✅ | ❌ |
| 虚拟摄像头(OBS Virtual Cam) | ✅ | ⚠️(通过 DirectShow) |
录制与输出
| 功能 | Video Capture SDK | MFormats SDK |
|---|---|---|
| MP4(H.264 / H.265) | ✅ | ✅ |
| MXF 容器 | ⚠️ | ✅(MFormats 在广播 MXF 方面表现突出) |
| MKV 容器 | ✅ | ❌ |
| WebM(VP8 / VP9 / AV1) | ✅ | ❌ |
| AVI | ✅ | ✅ |
| MOV(ProRes) | ✅ | ✅ |
| WMV / ASF | ✅ | ✅ |
| MPEG-TS | ✅ | ✅ |
| 动画 GIF | ✅ | ❌ |
| 纯音频(MP3、AAC、WAV、FLAC) | ✅ | ⚠️ |
| 预事件录制(循环缓冲区) | ✅ | ❌ |
多输出
| 功能 | Video Capture SDK | MFormats SDK |
|---|---|---|
| 同时录制 + 流式传输 | ✅ | ✅ |
| 多个独立录制输出 | ✅ | ⚠️(需要手动帧克隆) |
| 独立输出控制(分别启动/停止/暂停) | ✅ | ⚠️(每个写入器手动控制) |
| 每个输出不同的编解码器 | ✅ | ✅ |
| 录制时截图 | ✅ | ✅ |
流式传输
| 功能 | Video Capture SDK | MFormats SDK |
|---|---|---|
| RTMP Push | ✅ | ✅ |
| RTSP 服务器 | ✅ | ❌ |
| SRT 流式传输 | ✅ | ✅ |
| HLS 输出 | ✅ | ⚠️ |
| NDI 输出 | ✅ | ✅ |
| UDP / TCP 组播 | ✅ | ✅ |
视频处理与特效
| 功能 | Video Capture SDK | MFormats SDK |
|---|---|---|
| 实时调整大小/裁剪 | ✅ | ✅ |
| 去隔行 | ✅ | ✅ |
| 颜色调整 | ✅ | ✅ |
| 文字/图像叠加 | ✅ | ✅ |
| HTML5 CG 叠加 | ❌ | ✅ |
| 色度键(绿幕) | ✅ | ✅ |
| GPU 加速视频特效(40+) | ✅ | ⚠️(内置特效有限) |
| 画中画 | ✅ | ✅ |
| 转场和擦除 | ✅ | ✅ |
音频
| 功能 | Video Capture SDK | MFormats SDK |
|---|---|---|
| 音频设备采集 | ✅ | ✅ |
| 音频混合(多输入) | ✅ | ✅ |
| 音频特效(40+ 内置:均衡器、压缩器、混响等) | ✅ | ❌ |
| VU 表/电平监控 | ✅ | ✅ |
| 系统音频环回采集 | ✅ | ⚠️ |
| 嵌入式音频路由(SDI) | ✅ | ✅ |
检测与分析
| 功能 | Video Capture SDK | MFormats SDK |
|---|---|---|
| 运动检测 | ✅ | ❌ |
| 人脸检测 | ✅ | ❌ |
| 条形码/二维码读取 | ✅ | ❌ |
| 目标跟踪 | ✅ | ❌ |
| 音频电平检测 | ✅ | ✅ |
广播与播出
| 功能 | Video Capture SDK | MFormats SDK |
|---|---|---|
| 播放列表/播出调度 | ❌ | ✅ |
| 多厂商 SDI 输出 | ⚠️ | ✅(MFormats 支持 AJA、Bluefish、Deltacast 输出) |
| HTML5 CG(字幕发生器)叠加 | ❌ | ✅ |
| 虚拟摄像头输出 | ✅ | ❌ |
| 同步锁定/参考同步 | ❌ | ✅ |
平台支持
操作系统兼容性
| 平台 | Video Capture SDK | MFormats SDK |
|---|---|---|
| Windows x64 | ✅ | ✅ |
| Windows ARM64 | ✅ | ❌ |
| macOS(Apple Silicon + Intel) | ✅ | ❌ |
| Linux x64(Ubuntu、Debian、Fedora) | ✅ | ❌ |
| Linux ARM64(Raspberry Pi) | ✅ | ❌ |
| Android(通过 .NET MAUI) | ✅ | ❌ |
| iOS(通过 .NET MAUI) | ✅ | ❌ |
UI 框架兼容性
| 框架 | Video Capture SDK | MFormats SDK |
|---|---|---|
| WinForms | ✅ | ✅ |
| WPF | ✅ | ✅ |
| .NET MAUI | ✅ | ❌ |
| Avalonia UI | ✅ | ❌ |
| Uno Platform | ✅ | ❌ |
| Console / Service | ✅ | ✅ |
| Blazor(Server-Side) | ✅ | ❌ |
价格对比
Video Capture SDK .NET 定价
1名开发者,商业使用,年度更新和支持
最多3名开发者,永久许可证,包含1年更新
最多8名开发者,永久许可证,包含1年更新
All licenses include:
- ✓ 免版税分发
- ✓ 所有源代码示例
- ✓ 优先工单支持
- ✓ 包含所有平台目标
- ✓ 永久许可选项:订阅到期后可继续使用(无水印)
MFormats SDK 定价
年度订阅,单个开发者,仅 Windows
5个开发者席位,3年订阅承诺
根据配置可能需要按部署收取运行时费用
订阅过期警告
MFormats SDK 使用强制性年度订阅模式。如果您的订阅过期或未续订:
- ⚠水印会自动添加到所有视频输出
- ⚠没有活跃订阅无法继续在生产环境中使用 SDK
- ⚠没有永久许可证备选方案
- ⚠如果许可证服务器无法验证,您部署的应用程序将显示水印
Video Capture SDK 提供购买后无限期继续工作的永久许可证,续订过期不会有水印惩罚。
代码示例
示例 1:摄像头采集到 MP4
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types.Output;
// Create the capture engine
var capture = new VideoCaptureCore();
// Set video source (first available webcam)
var devices = await capture.Video_CaptureDevice_ListAsync();
capture.Video_CaptureDevice = devices[0];
// Set audio source
var audioDevices = await capture.Audio_CaptureDevice_ListAsync();
capture.Audio_CaptureDevice = audioDevices[0];
// Configure MP4 output with H.264
capture.Output_Format = new MP4Output
{
Video = new H264EncoderSettings
{
Bitrate = 4000,
Profile = H264Profile.Main
},
Audio = new AACEncoderSettings
{
Bitrate = 192
}
};
capture.Output_Filename = "recording.mp4";
// Enable preview
capture.Video_Preview_Enabled = true;
// Start recording with preview
await capture.StartAsync();MFormats SDK
C#// MFormats: Frame-based capture loop
MFDeviceClass devClass = new MFDeviceClass();
MFReaderClass reader = new MFReaderClass();
MFWriterClass writer = new MFWriterClass();
MFRendererClass renderer = new MFRendererClass();
// Configure video device
reader.DeviceSet(eMFDeviceType.eMFDT_Video, 0, "");
reader.DeviceSet(eMFDeviceType.eMFDT_Audio, 0, "");
// Configure writer output
writer.WriterSet("recording.mp4", 0, "");
// You must run the capture loop yourself
while (capturing)
{
MFFrame frame;
reader.SourceFrameGet(-1, out frame, "");
if (frame != null)
{
// Preview
renderer.RenderSet("preview", frame, "");
// Write to file
writer.WriterPut(frame, "");
// Release frame manually
Marshal.ReleaseComObject(frame);
}
Thread.Sleep(1); // Manual timing
}示例 2:IP 摄像头 + 叠加 + 流式传输
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types.Output;
var capture = new VideoCaptureCore();
// IP camera source
capture.IP_Camera_Source = new IPCameraSourceSettings
{
URL = "rtsp://192.168.1.100:554/stream",
Type = IPCameraType.RTSP
};
// Add text overlay
capture.Video_Overlays.Add(new VideoOverlayText
{
Text = "{timestamp} - Camera 1",
Position = new System.Drawing.Point(10, 10),
Font = new System.Drawing.Font("Arial", 14),
Color = System.Drawing.Color.White
});
// Stream to RTMP
capture.Network_Streaming_Enabled = true;
capture.Network_Streaming_Format = new RTMPOutput
{
URL = "rtmp://streaming-server/live",
StreamKey = "stream_key",
Video = new H264EncoderSettings { Bitrate = 4500 },
Audio = new AACEncoderSettings { Bitrate = 128 }
};
// Also record locally
capture.Output_Filename = "backup.mp4";
capture.Output_Format = new MP4Output();
await capture.StartAsync();MFormats SDK
C#// MFormats: Manual frame loop with overlay + streaming
MFReaderClass reader = new MFReaderClass();
MFWriterClass localWriter = new MFWriterClass();
MFWriterClass rtmpWriter = new MFWriterClass();
MFRendererClass renderer = new MFRendererClass();
// Configure RTSP source
reader.ReaderOpen("rtsp://192.168.1.100:554/stream", "");
// Configure outputs
localWriter.WriterSet("backup.mp4", 0, "");
rtmpWriter.WriterSet("rtmp://streaming-server/live/stream_key", 0, "");
while (capturing)
{
MFFrame frame;
reader.SourceFrameGet(-1, out frame, "");
if (frame != null)
{
// Add overlay manually via MFTransform
MFOverlayClass overlay = new MFOverlayClass();
overlay.OverlayTextSet(frame,
DateTime.Now.ToString() + " - Camera 1",
10, 10, 14, "Arial", 0xFFFFFF, 0, "");
// Clone frame for second output
MFFrame clone;
frame.MFClone(out clone, eMFrameClone.eMFC_Full, eMFCC.eMFCC_Default);
// Write to local file
localWriter.WriterPut(frame, "");
// Write to RTMP stream
rtmpWriter.WriterPut(clone, "");
Marshal.ReleaseComObject(clone);
Marshal.ReleaseComObject(frame);
}
}何时选择每个解决方案
在以下情况选择 Video Capture SDK
- ✓跨平台采集应用程序(Windows、macOS、Linux、移动端)
- ✓具有自动线程和缓冲区管理的管道式架构
- ✓40+ 内置 GPU 加速视频和音频特效
- ✓采集期间的运动检测、人脸检测、条形码扫描
- ✓用于 OBS、Zoom、Teams 集成的虚拟摄像头输出
- ✓具有永久许可选项的经济实惠许可
- ✓具有独立启动/停止控制的多个独立输出
- ✓工业相机支持(GenICam、GigE Vision)
- ✓电视调谐器和 DVB 采集支持
在以下情况选择 MFormats SDK
- ✓多厂商 SDI 支持:Blackmagic 之外还有 AJA、Bluefish444、Deltacast
- ✓具有播放列表调度和自动化的广播播出
- ✓用于直播广播的 HTML5 CG(字幕发生器)叠加
- ✓广播工作室环境的同步锁定和参考同步
- ✓对每个处理步骤的逐帧手动控制
- ✓具有完整广播元数据支持的 MXF 容器格式
- ✓与现有广播基础设施和 SDI 路由器的集成
决策矩阵
| 需求 | Video Capture SDK | MFormats SDK | 胜出者 |
|---|---|---|---|
| 跨平台支持 | Video Capture SDK | ||
| 具有独立控制的多输出 | Video Capture SDK | ||
| 音频特效(40+ 内置) | Video Capture SDK | ||
| GPU 视频特效 | Video Capture SDK | ||
| 运动/人脸/条形码检测 | Video Capture SDK | ||
| 虚拟摄像头输出 | Video Capture SDK | ||
| 预算低于 2,000 欧元 | Video Capture SDK | ||
| 永久许可选项 | Video Capture SDK | ||
| 工业相机(GenICam) | Video Capture SDK | ||
| 电视调谐器/DVB 采集 | Video Capture SDK | ||
| 多厂商 SDI(AJA、Bluefish444) | MFormats SDK | ||
| 广播用 HTML5 CG 叠加 | MFormats SDK |
结论
Video Capture SDK .NET
Video Capture SDK 作为面向 .NET 开发者的跨平台、管道式采集引擎表现出色,适合需要丰富视频处理、检测功能、多个独立输出和广泛设备支持的场景。其声明式 API、40+ GPU 特效和永久许可使其成为从桌面到移动端大多数采集应用的性价比之选。
MFormats SDK
MFormats SDK 是需要多厂商 SDI 硬件支持(AJA、Bluefish444、Deltacast)、HTML5 CG 叠加和基于播放列表的播出自动化的广播工作流的有力选择。其基于帧的架构提供了适合专业广播环境的逐帧精细控制。但是,它仅支持 Windows,价格显著更高,且订阅过期后会添加水印。
The Reality
对于大多数 .NET 视频采集项目 - 尤其是需要跨平台支持、检测功能或经济实惠许可的项目 - Video Capture SDK 是明确的选择。MFormats 在 AJA/Bluefish 硬件集成和 CG 叠加工作流不可或缺的多厂商 SDI 广播工作室中占有一席之地。
