C # WPF Попытка получить источник из MediaElement и перенести его на новый элемент управления - PullRequest
0 голосов
/ 30 июня 2018

Вчера я опубликовал тему о VLC player и ее элементах управления.

Добавление элементов xaml для проигрывателя VLC в приложение WPF

Через некоторое время я нашел здесь возможное решение:

Интеграция проигрывателя VLC в проект C # (WPF) с использованием Vlc.DotNet

Я немного изменил это, чтобы использовать свой конкретный случай:

Xaml:

 <Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vlc="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <vlc:VlcControl x:Name="vlcPlayer" />
    <MediaElement x:Name="movOld" HorizontalAlignment="Left" Height="100" Margin="57,74,0,0" VerticalAlignment="Top" Width="100" Source="Resources/Global_Large_crate_opens.mp3"/>
</Grid>

Код:

    public MainWindow()
    {
        InitializeComponent();
        vlcPlayer.MediaPlayer.VlcLibDirectory = new DirectoryInfo(@"D:\VideoLAN\VLC\");
        vlcPlayer.MediaPlayer.EndInit();                       

        Uri thisUri = new Uri(@"C:\Users\User\Documents\Visual Studio 2017\Projects\WpfApp1\WpfApp1\Resources\VideoFallingFromTable.ogv", UriKind.RelativeOrAbsolute);
        vlcPlayer.MediaPlayer.Play(thisUri);
    }

Этот код отлично работает, когда я указываю полный путь от моего компьютера. Однако для моей игры мне нужно выбрать путь от MediaElements, например movOld в этом случае.

Однако, когда я пытаюсь сделать это:

        Uri thisUri = new Uri(movOld.Source.ToString(), UriKind.RelativeOrAbsolute);
        vlcPlayer.MediaPlayer.Play(thisUri);

Я получаю это исключение:

{"This operation is not supported for a relative URI."}

Все мои попытки получить имя файла или путь к файлу string или использовать "ToAbsolute()" имели одно и то же расширение.

Может кто-нибудь помочь мне найти, где ошибка, и как ее исправить?

Так как игра будет использоваться на многих компьютерах с различными возможными местами установки, очень важно загрузить новый источник для существующих MediaElements.

1 Ответ

0 голосов
/ 30 июня 2018

Я не уверен, почему вы используете Media Element, когда у вас есть контроль VLC. В любом случае, убедитесь, что путь к источнику медиаэлемента " Resources / Global_Large_crate_opens.mp3 " существует. Вы уверены, что это косая черта? обычно в Windows пути используют обратную косую черту. Также, если ваш путь абсолютен, вам нужно определить его следующим образом:

Uri thisUri = new Uri(movOld.Source.ToString(), UriKind.Absolute);
vlcPlayer.MediaPlayer.Play(thisUri);

Проблема только в вашем пути к источнику медиаэлемента. Просто убедитесь, что все, что вы положили там, существует и доступно.

Обновление:

Недавно я работал с элементом управления VLC, где я создал свой собственный элемент управления пользователя, чтобы скрыть логику библиотеки VLC, и раскрыл путь к файлу и другие свойства зависимостей, чтобы указать их из XAML. Вы можете попробовать использовать минимальную версию этого элемента управления в своем приложении.

public partial class VLCControl : UserControl
{
    public VLCControl()
    {
        InitializeComponent();
        var currentDirectory = AppDomain.CurrentDomain.BaseDirectory;
        string platform = Environment.Is64BitProcess ? "x64" : "x86";
        var dirPath = System.IO.Path.Combine(currentDirectory, "vlclib", platform);
        vlc.MediaPlayer.VlcLibDirectory = new DirectoryInfo(dirPath);
        vlc.MediaPlayer.EndInit();
    }

    public void Play()
    {
        if (vlc.IsInitialized && !String.IsNullOrWhiteSpace(FilePath))
        {
            var options = new string[]
            {
                String.Format("input-repeat={0}", Repeat)
            };
            vlc.MediaPlayer.SetMedia(new Uri(FilePath), options);

            if (!String.IsNullOrWhiteSpace(AspectRatio))
                vlc.MediaPlayer.Video.AspectRatio = AspectRatio;

            vlc.MediaPlayer.Play();
        }
    }

    public void Stop()
    {
        vlc.MediaPlayer.Stop();
    }

    public string AspectRatio
    {
        get { return (string)GetValue(AspectRatioProperty); }
        set { SetValue(AspectRatioProperty, value); }
    }

    public static readonly DependencyProperty AspectRatioProperty =
        DependencyProperty.Register("AspectRatio", typeof(string), typeof(VLCControl));


    public string FilePath
    {
        get { return (string)GetValue(FilePathProperty); }
        set { SetValue(FilePathProperty, value); }
    }

    public static readonly DependencyProperty FilePathProperty =
        DependencyProperty.Register("FilePath", typeof(string), typeof(VLCControl));


    public int Repeat
    {
        get { return (int)GetValue(RepeatProperty); }
        set { SetValue(RepeatProperty, value); }
    }

    public static readonly DependencyProperty RepeatProperty =
        DependencyProperty.Register("Repeat", typeof(int), typeof(VLCControl), new PropertyMetadata(-1));

    private void vlc_Loaded(object sender, RoutedEventArgs e)
    {
        Play();
    }
}

Код файла XAML:

<UserControl x:Class="VLCControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             xmlns:vlc="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"
             d:DesignHeight="300" d:DesignWidth="300" >
    <vlc:VlcControl x:Name="vlc" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Loaded="vlc_Loaded"/>
</UserControl>

Если это помогло вам, то не забудьте принять ответ:)

...