0

我想开发一种将网络摄像头视频作为输入的计算机视觉算法。为此,我需要以与将要制作的图像相同的格式记录视频的训练数据集。如何将H.264视频源直接记录到Windows中的文件中.Media.Capture

我担心在有损格式编码的视频文件,然后进行训练会降低否则改变训练图像,使他们不会完全一样,我会在生产中看到的图像解码他们。

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

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

我的问题是:

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

  2. 如何从H264视频源直接录制到文件,无需解码和重新编码?

我正在使用新的Windows.Media.Capture API - 但如果需要,我会使用其他API。

+0

忘记了说明我在x64 .NET上。 Windows.Media.Capture不仅适用于UWP。 –

回答

1

Surface Pro 3(与Surface Pro 4不同)配备了相机,可以使用H.264 hardware compression,这就是您将YUY2和H264视为可用选项的原因。

它是压缩的视频,所以YUY2是新进料和H264是其衍生物相机。

是这个假设是真的吗? H264是否是源代码,YUY2是源代码的产品?我该如何检查?

不,这是相反的。

如何从H264视频源直接录制文件而无需解码和重新编码?

读取H264并将其路由到多路复用器以产生具有H264视频轨道的MP4文件。 Windows Media Foundation的源代码阅读器和接收器编写器(可能还有媒体会话API)绝对有可能,而且我不确定Windows.Media.Capture可能是上述提到的一层。

+0

好。如果H.264是衍生产品,那么在软件中使用相机编码进料通过重新编码是没有好处的,因为我会以任何方式丢失原始数据。 –

+0

优势可能是零负载压缩(尽管在很多情况下,您仍然可以选择使用硬件H.264压缩器捕获原始数据和压缩数据),然后相机可能能够使用特定参数/模式进行压缩,例如SVC。最后,在H.264中进行捕捉可以在很多情况下实现更高的分辨率/速率组合。 –

+0

所有这一切都是事实。我不清楚如何使用MediaCapture录制该流,而无需重新编码。我很困扰它能够“偷偷地”重新编码,没有任何迹象表明正在发生。我希望按照您的建议使用Windows Media Foundation并直接记录流。 –

0

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

基本上,它创造了一个摄像头,并MediaFrameReader订阅它的FrameArrived事件。您应该有权访问H264框架并将其提供给接收器。或者使用MediaCapture.StartRecordToCustomSinkAsync,您需要提供自定义IMediaExtension媒体接收器。检查SimpleCommunication示例:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/SimpleCommunication

+0

我正在使用MediaCapture.StartRecordToStorageFileAsync录制到存储文件。为什么我需要CustomSink? 问题是,无论输入分辨率为**,文件的宽度分辨率都是**,表示它已被重新编码。
根据[MediaCapture API](https://docs.microsoft.com/en-us/uwp/api/windows.media.capture.mediacapture):*如果本机类型为H.264,则可以录制使用类型与本机类型相同的视频媒体类型。您无法将效果添加到H.264本机类型流* –

1

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

这是最肯定不是的情况下,YUY2格式是受网络摄像头和h.264饲料捕获的原始数据被该数据的压缩格式。所以你可以放心,它不是有损的。

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