C# 在.NET核心项目中使用UWP api中的Miracast无法接收视频帧

C# 在.NET核心项目中使用UWP api中的Miracast无法接收视频帧,c#,wpf,uwp,mirroring,miracast,C#,Wpf,Uwp,Mirroring,Miracast,我们设法使用UWP创建了一个工作的Miracast接收器,我们希望在.NET核心应用程序中使用此功能。 因此,我们遵循本指南在.NET核心项目中使用UWP API: 项目运行时,我们从智能手机连接到应用程序,但是我们没有从MediaPlayer对象接收到任何视频帧(与正常工作的原始UWP项目不同) 我们观察到,在MediaSource对象中,我们获得了一个mcrecv url (示例->mcrecv://192.168.137.247:7236/h-0000000(C/192.168.137.

我们设法使用UWP创建了一个工作的Miracast接收器,我们希望在.NET核心应用程序中使用此功能。 因此,我们遵循本指南在.NET核心项目中使用UWP API:

项目运行时,我们从智能手机连接到应用程序,但是我们没有从MediaPlayer对象接收到任何视频帧(与正常工作的原始UWP项目不同)

我们观察到,在MediaSource对象中,我们获得了一个mcrecv url (示例->mcrecv://192.168.137.247:7236/h-0000000(C/192.168.137.1)

但是使用它的MediaPlayer不会触发任何VideoFrameAvailable事件

我们如何解决这个问题? 以下是我们使用的基本实现:

using System;
using System.Diagnostics;
using System.Windows;
using Windows.Graphics.Imaging;
using Windows.Media.Miracast;
using Windows.Media.Playback;

namespace Miracast_GUI
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MiracastReceiver receiver;
        public MiracastReceiverSession session;
        public MediaPlayer mp;
        public SoftwareBitmap frameServerDest;
        public MiracastReceiverConnection connection;

        public MainWindow()
        {
            InitializeComponent();
            // Starts service
            StartMiracastService();
        }

        public void StartMiracastService()
        {
            receiver = new MiracastReceiver();
            receiver.StatusChanged += Receiver_StatusChanged;
            MiracastReceiverSettings settings = receiver.GetDefaultSettings();

            settings.FriendlyName = "Miracast-Service-Test";
            settings.AuthorizationMethod = MiracastReceiverAuthorizationMethod.None;
            settings.ModelName = receiver.GetDefaultSettings().ModelName;
            settings.ModelNumber = receiver.GetDefaultSettings().ModelNumber;
            settings.RequireAuthorizationFromKnownTransmitters = receiver.GetDefaultSettings().RequireAuthorizationFromKnownTransmitters;

            receiver.DisconnectAllAndApplySettings(settings);

            session = receiver.CreateSession(/*CoreApplication.MainView*/ null);
            session.AllowConnectionTakeover = true;

            session.ConnectionCreated += Session_ConnectionCreated;
            session.MediaSourceCreated += Session_MediaSourceCreated;
            session.Disconnected += Session_Disconnected;

            MiracastReceiverSessionStartResult result = session.Start();
            Debug.WriteLine("Status: " + result.Status);
        }

        private void Session_Disconnected(MiracastReceiverSession sender, MiracastReceiverDisconnectedEventArgs args)
        {
            session.Dispose();
        }

        private void Receiver_StatusChanged(MiracastReceiver sender, object args)
        {
            Debug.WriteLine(receiver.GetStatus().ListeningStatus);
        }

        private void Session_ConnectionCreated(MiracastReceiverSession sender, MiracastReceiverConnectionCreatedEventArgs args)
        {
            connection = args.Connection;
            connection.InputDevices.Keyboard.TransmitInput = true;
            connection.InputDevices.GameController.Mode =
                MiracastReceiverGameControllerDeviceUsageMode.AsMouseAndKeyboard;

            Debug.WriteLine("CONNECTION CREATED");
        }

        private void Session_MediaSourceCreated(MiracastReceiverSession sender, MiracastReceiverMediaSourceCreatedEventArgs args)
        {
            mp = new MediaPlayer
            {
                IsVideoFrameServerEnabled = true,
                AutoPlay = true,
                Source = args.MediaSource,
                RealTimePlayback = true
            };

            mp.VideoFrameAvailable += Mp_VideoFrameAvailable;
            Debug.WriteLine(mp.PlaybackSession.PlaybackState);
            mp.Play();

            Debug.WriteLine("MEDIA SOURCE CREATED");
        }

        private void Mp_VideoFrameAvailable(MediaPlayer sender, object args)
        {
            Console.WriteLine("Received frame...");
        }
    }
}
使用系统;
使用系统诊断;
使用System.Windows;
使用Windows.Graphics.Imaging;
使用Windows.Media.Miracast;
使用Windows.Media.Playback;
名称空间Miracast_GUI
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共接收机;
公开会议;
公共媒体播放器;
公共软件位图frameServerDest;
公共连接;
公共主窗口()
{
初始化组件();
//开始服务
StartMiracastService();
}
public void StartMiracastService()
{
接收器=新的MiracastReceiver();
receiver.StatusChanged+=receiver\u StatusChanged;
MiracastReceiverSettings=receiver.GetDefaultSettings();
settings.FriendlyName=“Miracast服务测试”;
settings.AuthorizationMethod=miracastereceiverauthorizationmethod.None;
settings.ModelName=receiver.GetDefaultSettings().ModelName;
settings.ModelNumber=receiver.GetDefaultSettings().ModelNumber;
settings.requireAuthorizationfromKnowntTransmiters=receiver.GetDefaultSettings().requireAuthorizationfromKnowntTransmiters;
接收器。断开所有和应用程序设置(设置);
session=receiver.CreateSession(/*CoreApplication.MainView*/null);
session.AllowConnectionTakeover=true;
session.ConnectionCreated+=session\u ConnectionCreated;
session.MediaSourceCreated+=session_MediaSourceCreated;
session.Disconnected+=session\u Disconnected;
MiracastReceiverSessionStartResult=session.Start();
Debug.WriteLine(“状态:+result.Status”);
}
专用无效会话\u已断开(MiracastReceiverSession发送方,MiracastReceiverDisconnectedEventArgs)
{
session.Dispose();
}
私有无效接收方\状态已更改(MiracastReceiver发送方,对象参数)
{
Debug.WriteLine(receiver.GetStatus().listingstatus);
}
已创建专用无效会话\u连接(MiracastReceiverSession发送方,MiracastReceiverConnectionCreatedEventArgs)
{
connection=args.connection;
connection.InputDevices.Keyboard.TransmitInput=true;
connection.InputDevices.GameController.Mode=
MiracastReceiverGameControllerDeviceUsageMode.a鼠标和键盘;
Debug.WriteLine(“已创建连接”);
}
私有无效会话\u MediaSourceCreated(MiracastReceiverSession发送方,MiracastReceiverMediaSourceCreatedEventArgs参数)
{
mp=新媒体播放器
{
IsVideoFrameServerEnabled=true,
自动播放=真,
Source=args.MediaSource,
RealTimePlayback=true
};
mp.VideoFrameAvailable+=mp\U VideoFrameAvailable;
Debug.WriteLine(mp.PlaybackSession.PlaybackState);
下院议员Play();
Debug.WriteLine(“创建的媒体源”);
}
私有void Mp\u VideoFrameAvailable(MediaPlayer发送方,对象参数)
{
Console.WriteLine(“接收帧…”);
}
}
}

如果“Internet(客户端和服务器)”功能未使用,UWP应用程序的MediaPlayer不会触发VideoFrameAvailable事件。也许WPF项目没有任何功能?因此,wpf应用程序无法使用需要此功能的其他服务。我不知道如何在wpf中使用uwp功能。

Hi@HansPassant感谢您的详细回复。miracast接收器对象已正确触发StatusChanged事件;我们的问题是,连接创建时,连接到Mediaplayer对象的VideoFrameAvailable事件没有触发。如果我们不理解您提出的解决方案,我们深表歉意。在这种情况下,您能进一步向我们解释一下吗?谢谢欢迎来到Stack Overflow。你的答案看起来更像一个问题。如果是这种情况,请删除您的答案。