Windows runtime 使用MediaCapture创建具有不同预览和录制流的视频

Windows runtime 使用MediaCapture创建具有不同预览和录制流的视频,windows-runtime,windows-store-apps,ms-media-foundation,Windows Runtime,Windows Store Apps,Ms Media Foundation,我正在尝试创建一个Windows应用商店应用程序,该应用程序允许用户界面被捕获并覆盖在来自网络摄像机的视频上 我使用MediaCapture类来管理视频捕获过程。我已经创建了一个MFT(基于灰度样本),它允许我以基本的方式完成这项工作。这个MFT已经作为一种效果添加到MediaCapture类的记录流中,我能够很容易地创建一个视频文件,其中UI覆盖在摄像头视频上。(容易是一个相对术语) 我遇到的问题是,来自MFT的覆盖显示在预览流中,预览流也显示在屏幕上。因此,用户界面正在正常显示,也在视频流中

我正在尝试创建一个Windows应用商店应用程序,该应用程序允许用户界面被捕获并覆盖在来自网络摄像机的视频上

我使用MediaCapture类来管理视频捕获过程。我已经创建了一个MFT(基于灰度样本),它允许我以基本的方式完成这项工作。这个MFT已经作为一种效果添加到MediaCapture类的记录流中,我能够很容易地创建一个视频文件,其中UI覆盖在摄像头视频上。(容易是一个相对术语)

我遇到的问题是,来自MFT的覆盖显示在预览流中,预览流也显示在屏幕上。因此,用户界面正在正常显示,也在视频流中显示。这是一个糟糕的结果,因为我不希望效果应用于预览流,也不希望用户在视频预览中看到UI,只在结果录制中看到UI

有没有办法让MediaCapture类只对记录流而不是预览流使用效果

如果没有一种简单的方法可以做到这一点,那么可以通过创建自定义接收器来实现吗?MediaCapture可以录制到自定义接收器,自定义接收器将添加覆盖并保存到视频?

使用一些摄像头(特别是USB网络摄像头),录制/预览/拍照都来自同一视频流。因此,对一个应用效果会对所有应用效果。视频流是相同的还是独立的由
MediaCapture.MediaCaptureSettings.VideoDeviceCharacteristic
给出

因此,在您的情况下,使用自定义水槽似乎是一种可行的方法。IMFSinkWriter可用于在添加覆盖后对帧进行编码

作为参考,代码片段为任何类型的相机添加了预览+录制效果(实际上与您尝试的操作相反):

MediaCapture capture = ...;
await capture.AddEffectAsync(MediaStreamType.VideoPreview, "Extensions.MyEffect", null);

// If preview and record are different streams, also add the effect there
if ((capture.MediaCaptureSettings.VideoDeviceCharacteristic != VideoDeviceCharacteristic.AllStreamsIdentical) && 
    (capture.MediaCaptureSettings.VideoDeviceCharacteristic != VideoDeviceCharacteristic.PreviewRecordStreamsIdentical))
{
    await capture.AddEffectAsync(MediaStreamType.VideoRecord, "Extensions.MyEffect", null);
}