SignalR WPF сервер - Как запустить плеер? - PullRequest
0 голосов
/ 17 января 2020

В настоящее время я работаю над автономным приложением, которое может обрабатывать связь с мобильного телефона, а также использует проигрыватель VL C для вывода потока. Я делаю так, что объект потока вывода находится в главном окне, но я получаю запросы через SignalR. Запрос довольно прост - это просто строка. Проблема в том, что я понятия не имею, как передать строку из концентратора SignalR обратно в объект MediaPlayer. Как получить строку, переданную внешнему объекту, или сделать так, чтобы медиаплеер "сохранялся" внутри хаба? На данный момент мой код относительно этого выглядит следующим образом:

Концентратор:


    [HubName("CommHub")]
    public class CommHub:Hub
    {
        VLCControl outputplayer = new VLCControl();
        public void RequestConnectionsList()            
        {
            var databasePath = "--dbpath here--";
            var db = new SQLiteConnection(databasePath);
            List<string> output = db.Table<VideoSources>().Select(p => p.Name).ToList();    //Gets names from the db
            Clients.Client(Context.ConnectionId).CamsInfo(output); //send available connection names to client
        }
        public void RequestOutStream(string requestedName) //this function is called but i have no idea how to make it work
        {
            outputplayer.playSelected(requestedName);
        }
    }

VLCControl:

class VLCControl
    {
        public Media rtsp;
        private const string VIDEO_URL = "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov";
        private MediaPlayer player;
        public static string GetConfigurationString()       //using this method in mainwindow player as well
        {
            string address = Properties.Settings.Default.LocalAddress;
            string port = Properties.Settings.Default.LocalPort;
            string result=
                    ":sout=#duplicate" +
                    "{dst=display{noaudio}," +
                    "dst=rtp{mux=ts,dst=" + address +
                    ",port=" + port + ",sdp=rtsp://" + address + ":" + port + "/go.sdp}";
             return result;
        }
        public void playSelected(string inputAddress)
        {
            var databasePath = "D:\\Projects\\Sowa\\Sowa\\Serwer\\VideoSources.db";
            var db = new SQLiteConnection(databasePath);
            string input = db.Table<VideoSources>().FirstOrDefault(p => p.Name == "test").Address;
            db.Close();
            var rtsp = new Media(MainWindow._libvlc, input, FromType.FromLocation);
            rtsp.AddOption(VLCControl.GetConfigurationString());
            player.Stop();
            player.Play(new Media(MainWindow._libvlc, VIDEO_URL, FromType.FromLocation));
        }
    }

Игроки определенно работают - когда я создаю медиаплеер в главном окне он действительно выводит, как ожидалось.

1 Ответ

0 голосов
/ 19 января 2020

Я думаю, что ваш вопрос можно перефразировать как «Как я могу вызвать метод для моего интерфейса из SignalR Hub»

Для этого у вас есть несколько вариантов:

  • Если вы используете ASP. net ядро ​​SignalR, вы можете использовать инъекцию зависимостей, чтобы внедрить ваше окно или аксессор в ваше окно
  • Вы можете получить ваше главное окно с помощью (MyWindow)Application.Current.MainWindow. То, что вы делаете с этим, зависит от вас
  • Вы можете создать класс stati c, который будет напрямую содержать ссылку на ваш компонент. В этом примере предполагается, что у вас есть только одно представление за раз в вашем приложении.
public static class ViewAccessor {
  public static MyView View { get; set; }
}

В конструкторе вашего представления после InitializeComponents:

ViewAccessor.View = this;

В вашем хабе:

ViewAccessor.View.Play(...);
...