如何将H.264视频源直接录制到文件Windows.Media.Capture

How to record H.264 video source directly to file in Windows.Media.Capture

我想开发一种将网络摄像头视频作为输入的计算机视觉算法。为此,我需要以与我将在生产中获得的图像相同的格式记录视频训练数据集。

我担心以有损格式编码视频文件,然后对其进行解码以进行训练会降级或改变训练图像,因此它们将与我在生产中看到的图像不完全相同。

现在,我看到我的网络摄像头(运行 在 Surface Pro 3 上)有 H264 视频源和 YUY2 视频源。

所以我想 – H264 是图像的来源,YUY2 可能是解码图像。如果我将 H264 直接录制到一个文件中,然后对该文件进行解码,那么解码后的图像将等同于我从 YUY2 视频源中获得的图像。我没有对新视频进行编码从而改变它,而是使用了已经编码的源 H264。

我的问题是:

  1. 这个假设是否成立? H264 是源,YUY2 是该源的产品吗?我该如何检查?

  2. 如何将H264视频源直接录制成文件而不进行解码和重新编码?

我正在使用新的 Windows.Media.Capture API – 但如有必要,我会使用其他 API。

您可以从 UWP SDK 检查 CameraFrames 示例:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFrames

基本上,它为网络摄像头创建一个 MediaFrameReader 并订阅它的 FrameArrived 事件。您应该可以访问那里的 H264 帧并将其提供给 Sink Writer 等。或者使用 MediaCapture.StartRecordToCustomSinkAsync,您需要在其中提供自定义 IMediaExtension 媒体接收器。检查 SimpleCommunication 示例:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/SimpleCommunication

因此,如果我没理解错的话,您是说您的网络摄像头公开了两种不同的可能流:H.264 编码流和 YUY2 编码流。您的假设是网络摄像头将 h.264 提要公开为主要格式,然后将其解压缩为 YUY2 格式。

肯定不是这种情况,YUY2 格式是网络摄像头捕获的原始数据,而 h.264 提要是该数据的压缩格式。所以你可以放心,它没有损耗。

有一些示例描述了如何将数据写入文件。

Surface Pro 3(顺便说一句,与 Surface Pro 4 不同)配备了能够 H.264 hardware compression 的相机,这就是您将 YUY2 和 H264 都视为可用选项的原因。

压缩视频的是摄像头,所以YUY2是raw feed,H264是它的衍生物。

Is this assumption true? Is the H264 feed the source and YUY2 the product of that source? How can I check?

不对,恰恰相反

How do I record from the H264 video source directly to files without decoding and re-encoding?

读取H264并将其路由到多路复用器以生成具有H264视频轨道的MP4文件。 Windows Media Foundation 的 Source Reader 和 Sink Writer 绝对有可能,也可能有 Media Session API,我不确定 Windows.Media.Capture 大概是上面提到的。