C# 使用MediaCapture的实时流媒体

C# 使用MediaCapture的实时流媒体,c#,c++,uwp,ms-media-foundation,C#,C++,Uwp,Ms Media Foundation,对于一个项目,我正在尝试创建一个视频通话应用程序。我是在通用Windows平台上这样做的,所以我想我可以使用MediaCapture类。 这个类确实有startrecordtocustomsinksync()方法,但是为了使用它,我需要创建一个自定义接收器。我开始创建一个,但现在我被困在创建流水槽。解释媒体接收器,但我找不到任何关于流接收器的文档 我还研究了和,但代码要么缺少注释,要么解决了另一个问题 有人知道我如何实现UWP视频通话应用程序,或者为我指出正确的方向吗 另外,我知道这类问题被问得

对于一个项目,我正在尝试创建一个视频通话应用程序。我是在通用Windows平台上这样做的,所以我想我可以使用MediaCapture类。 这个类确实有
startrecordtocustomsinksync()
方法,但是为了使用它,我需要创建一个自定义接收器。我开始创建一个,但现在我被困在创建流水槽。解释媒体接收器,但我找不到任何关于流接收器的文档

我还研究了和,但代码要么缺少注释,要么解决了另一个问题

有人知道我如何实现UWP视频通话应用程序,或者为我指出正确的方向吗

另外,我知道这类问题被问得更多,但没有可用的答案:(

您的具体实施

实现你自己的<代码> IMFMediaSink 和<代码> IMFStreamSink < /Cord>类的最重要的第一步是找出你真正想要做的是用<代码> IMFStase实例。一旦你知道你想要做什么样的下沉,然后考虑你从哪里得到样本,不管我是不是它是UWP

MediaCapture
类,是一个
IMFSinkWriter
,是一个
IMFTopology
,甚至只是从客户端代码直接调用接收器

如果您的目标是拥有一个双向音频/视频聊天应用程序,则应用程序的每个实例都需要捕获音频和视频,以压缩格式进行编码,然后将这些示例发送到另一个实例。
mediaccapture
将处理除网络传输部分之外的几乎所有内容。因此,另一个实例需要因此,您需要一个自定义的
IMFMediaSink
实现,它从
MediaCapture
接收
IMFSample
实例,然后通过网络传输它们。您还需要一个接收samp的
IMFMediaSource
实现从网络源中删除并将其发送给演示者以呈现给用户。在这种情况下,演示者将是
MediaCapture
的一个实例。每个应用程序实例将同时运行两个自定义源和接收器-一个始终捕获音频和视频并通过网络发送,另一个重新发送从另一个应用程序实例接收并呈现该数据

一种方法是为传输媒体接收器和接收媒体源提供一个套接字接口。您需要找到一种方法来处理网络中断,干净地恢复数据传输并在两侧显示。处理此问题的最简单方法之一是在actua上有一个轻量级消息层l视频和音频样本传输,以便您可以表示从发送方到接收方的流消息开始,这将允许接收方转储任何排队的样本,并使用到达的第一个新样本重新启动其表示时钟,然后保持一致显示。同样,
MediaCapture
类将可能会为您处理很多这样的逻辑,但您必须小心,您的源和接收器的行为就像
MediaCapture
所期望的那样

你还需要建立一个方案来缓冲每侧的数据,这样较小的网络延迟不会导致音频和视频的断断续续。如果你以30 fps的速度播放视频,你需要每33毫秒显示一个新帧,这意味着每个应用实例都需要有足够的数据缓冲,以保证演示者可以显示一个帧在这个时间间隔。音频基本相同-音频样本有持续时间,因此您需要确保有足够的样本数据进行连续播放。但是,您也不需要太多的缓冲,因为您将获得“卫星电视”效果,即人类对话的心理导致每个人说话之间的巨大差距,因为他们在等待你的应用程序发送的音频在他们开始说话之前停止,缓冲延迟会扩大这些差距。微软对缓冲进行了一般性的讨论,即使是具体的考虑也是有用的。属于ASF流媒体

最后一个实现相关的建议是查看现有的网络流媒体格式可以使用。虽然您仍然需要实现您自己的源、媒体接收器和流汇,但是通过在现有媒体基础实现周围写入WrRT启用的包装器,您可以避免担心绝大多数。低级详细信息。我在这里看到的最简单的方法是编写一个包装类,该类实现

IMFMediaSink
,并保存使用创建的媒体接收器的内部副本。您可能还需要编写一个启用WinRT的实现,您可以将其提供给媒体接收器,然后将其传递给ASF流媒体接收器。On在源端,您将编写一个
IMFMediaSource
,它从网络字节流中读取并包装一个ASF文件媒体源。

IMFMediaSink
IMFStreamSink

我不能给你一些你想要的代码,主要是因为实现自定义媒体接收器和流汇集需要相当大的工作量,而你的需求在这种情况下是非常具体的。相反,我希望我能帮助你更好地理解媒体库中媒体下沉和流汇的作用。我离UWP专家很远。所以我会尽我所能在媒体基金会上做贡献。

<>从我对UWP的代码> MediaPACTION/CONT>类的理解中,自定义接收器负责与WinRT端和COM/媒体基础侧的接口,因此必须实现两边的接口。这是因为<代码> MediaPACTHESIO/<代码>或多或少是许多媒体基础技术上的一个UWP包装器。s被抽象掉了。sa