Powiązanie Danych MediaElement

0

Witam serdecznie. Mam do was pytanie. Używam Visual Studio 2015. Tworze aplikacje centrum metro. Dodałem do niej MediaElement. Stworzyłem powiązanie danych jako ścieżka do pliku video i niestety nie trybi.(Posiadam podobne powiązanie ścieżki do obrazka i to działa) Kiedy ustawie na sztywno po przez wybranie Source w zakładce multimedia to śmiga aż miło. Puściłem aplikacje krok po kroku i podejrzałem że powiązanie danych przekazuje link do kontrolki ale się nic nie dzieje. Wyświetla się tylko PosterSource ustawiony na sztywno. Czy istnieje jeszcze coś co powinienem dodać? Proszę o pomoc ;)

0

Witam. Jeżeli chodzi o bliding to się dopiero uczę co i jak to powinno działać. Utworzyłem standardowy szablon visual studio 2015 aplikacja centrum systemu windows 8.1. Dostosowałem go sobie mniej więcej do swoich potrzeb. oto część zawartości pliku SampleData.json:

 {"Groups":[
  {
    "UniqueId": "Lista_Seriali",
    "Title": "Lista Seriali",
    "Subtitle": " ",
    "ImagePath": "Assets/ListaSerialiLogo.png",    
    "Description" : "Lista Seriali",
    "Items":
    [
      {
        "UniqueId": "Group-1-Item-1",
        "Title": "12 Monkeys",
        "Subtitle": Gatunek",
        "ImageVideoPath": "Assets/12MonkeysMediaPic.png",
        "ImagePath": "Assets/12MonkeysLogo.png",
        "VideoPath": "Media/12_Monkeys_Trailer.mp4",
        "Description" : " ",
        "Content": "Opis serialu",
        "ContentSeries": "Sezon 1",
        "ContentSeriesSeason1": "Opis sezonu"
      },
      {
        "UniqueId": "Group-1-Item-2",
        "Title": "American Horror Story",
        "Subtitle": "Gatunek",
        "ImageVideoPath": "Assets/AmericanHorrorStoryMediaPic.png",
        "ImagePath": "Assets/AmericanHorrorStoryLogo.png",
        "VideoPath": "Media/American_Horror_Story_Trailer.mp4",
        "Description" : " ",
        "Content": "Opis serialu",
        "ContentSeries": "Sezon 1  ",
        "ContentSeriesSeason1": " Opis sezonu 1 "
      },
      {
        "UniqueId": "Group-1-Item-3",
        "Title": "Arrow",
        "Subtitle": "Gatunek",
        "ImageVideoPath": "Assets/ArrowMediaPic.png",
        "ImagePath": "Assets/ArrowLogo.png",
        "VideoPath": "Media/Arrow_Trailer.mp4",
        "Description" : " ",
        "Content": "Opis serialu",
        "ContentSeries": "Sezon 1 ",
        "ContentSeriesSeason1": " Opis sezonu 1"
      }      
    ]

Oto plik SampleDataSource.cs

 using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using Windows.Data.Json;
using Windows.Storage;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;

// Model danych zdefiniowany przez ten plik służy jako reprezentatywny przykład silnie typizowanego
// model.  Wybrane nazwy właściwości pokrywają się z powiązaniami danych w standardowych szablonach elementów.
//
// Aplikacje mogą używać tego modelu jako punktu wyjścia i na nim kompilować, albo odrzucić go całkowicie i
// zamienić na coś odpowiadającego ich potrzebom. Użycie tego modelu pozwala poprawić 
// czas odpowiedzi aplikacji, inicjując zadanie ładowania danych w pliku związanym z kodem App.xaml, gdy aplikacja 
// jest uruchamiana po raz pierwszy.

namespace Centrum_Seriali.Data
{
    /// <summary>
    /// Ogólny model elementów danych.
    /// </summary>
    public class SampleDataItem
    {
        public SampleDataItem(String uniqueId, String title, String subtitle, String imageVideoPath, String imagePath, 
        String videoPath, String description, String content, String contentSeries, 
        String contentSeriesSeason1)
        {
            this.UniqueId = uniqueId;
            this.Title = title;
            this.Subtitle = subtitle;
            this.Description = description;
            this.ImageVideoPath = imageVideoPath;
            this.ImagePath = imagePath;
            this.VideoPath = videoPath;
            this.Content = content;
            this.ContentSeries = contentSeries;
            this.ContentSeriesSeason1 = contentSeriesSeason1;
        }

        public string UniqueId { get; private set; }
        public string Title { get; private set; }
        public string Subtitle { get; private set; }
        public string Description { get; private set; }
        public string ImageVideoPath { get; private set; }
        public string ImagePath { get; private set; }
        public string VideoPath { get; private set; }
        public string Content { get; private set; }
        public string ContentSeries { get; private set; }
        public string ContentSeriesSeason1 { get; private set; }

        public override string ToString()
        {
            return this.Title;
        }
    }

    /// <summary>
    /// Ogólny model grupy danych.
    /// </summary>
    public class SampleDataGroup
    {
        public SampleDataGroup(String uniqueId, String title, String subtitle, String imagePath, String description)
        {
            this.UniqueId = uniqueId;
            this.Title = title;
            this.Subtitle = subtitle;
            this.Description = description;
            this.ImagePath = imagePath;
            this.Items = new ObservableCollection<SampleDataItem>();
        }

        public string UniqueId { get; private set; }
        public string Subtitle { get; private set; }
        public string Title { get; private set; }
        public string Description { get; private set; }
        public string ImagePath { get; private set; }
        public ObservableCollection<SampleDataItem> Items { get; private set; }

        public override string ToString()
        {
            return this.Title;
        }
    }

    /// <summary>
    /// Tworzy kolekcję grup i elementów z zawartością odczytywaną ze statycznego pliku json.
    /// 
    /// Obiekt SampleDataSource jest inicjowany danymi odczytanymi ze statycznego pliku json dołączonego do 
    /// projektu.  Dostarcza przykładowe dane zarówno w czasie projektowania, jak i w czasie wykonywania.
    /// </summary>
    public sealed class SampleDataSource
    {
        private static SampleDataSource _sampleDataSource = new SampleDataSource();

        private ObservableCollection<SampleDataGroup> _groups = new ObservableCollection<SampleDataGroup>();
        public ObservableCollection<SampleDataGroup> Groups
        {
            get { return this._groups; }
        }

        public static async Task<IEnumerable<SampleDataGroup>> GetGroupsAsync()
        {
            await _sampleDataSource.GetSampleDataAsync();

            return _sampleDataSource.Groups;
        }

        public static async Task<SampleDataGroup> GetGroupAsync(string uniqueId)
        {
            await _sampleDataSource.GetSampleDataAsync();
            // Proste wyszukiwanie liniowe jest akceptowalne dla małych zestawów danych
            var matches = _sampleDataSource.Groups.Where((group) => group.UniqueId.Equals(uniqueId));
            if (matches.Count() == 1) return matches.First();
            return null;
        }

        public static async Task<SampleDataItem> GetItemAsync(string uniqueId)
        {
            await _sampleDataSource.GetSampleDataAsync();
            // Proste wyszukiwanie liniowe jest akceptowalne dla małych zestawów danych
            var matches = _sampleDataSource.Groups.SelectMany(group => group.Items).Where((item) => item.UniqueId.Equals(uniqueId));
            if (matches.Count() == 1) return matches.First();
            return null;
        }

        private async Task GetSampleDataAsync()
        {
            if (this._groups.Count != 0)
                return;

            Uri dataUri = new Uri("ms-appx:///DataModel/SampleData.json");

            StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(dataUri);
            string jsonText = await FileIO.ReadTextAsync(file);
            JsonObject jsonObject = JsonObject.Parse(jsonText);
            JsonArray jsonArray = jsonObject["Groups"].GetArray();

            foreach (JsonValue groupValue in jsonArray)
            {
                JsonObject groupObject = groupValue.GetObject();
                SampleDataGroup group = new SampleDataGroup(groupObject["UniqueId"].GetString(),
                                                            groupObject["Title"].GetString(),
                                                            groupObject["Subtitle"].GetString(),                                                           
                                                            groupObject["ImagePath"].GetString(),                                                           
                                                            groupObject["Description"].GetString());

                foreach (JsonValue itemValue in groupObject["Items"].GetArray())
                {
                    JsonObject itemObject = itemValue.GetObject();
                    group.Items.Add(new SampleDataItem(itemObject["UniqueId"].GetString(),
                                                       itemObject["Title"].GetString(),
                                                       itemObject["Subtitle"].GetString(),
                                                       itemObject["ImageVideoPath"].GetString(),
                                                       itemObject["ImagePath"].GetString(),
                                                       itemObject["VideoPath"].GetString(),
                                                       itemObject["Description"].GetString(),
                                                       itemObject["Content"].GetString(),
                                                       itemObject["ContentSeries"].GetString(),
                                                       itemObject["ContentSeriesSeason1"].GetString()));


                }
                this.Groups.Add(group);
            }
        }
    }
}

ImageVideoPath działa bez problemowo. Obraz w mediaElement wyświetla się poprawnie również ImagePath w kontrolce Image.
Niestety VideoPath nie trybi.

0

MediaElement.Source jest typu Uri. Kiedy próbujesz przypisać (zbindować) stringa z Uri dla MediaElement wyskoczy ci coś takiego:

Error: Converter failed to convert value of type 'Windows.Foundation.String' to type 'Uri'; BindingExpression: Path='MyProperty' DataItem='App2.Data, App2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'; target element is 'Windows.UI.Xaml.Controls.MediaElement' (Name='media'); target property is 'Source' (type 'Uri').

W przypadku obrazka z kolei to właściwość Source jest typu ImageSource, dlatego to działa. Mówiąc bardziej po ludzku: albo zrobisz sobie, aby w twoim modelu VideoPath było typu Uri a nie typu String (tylko nie wiem, czy to zadziała, jeżeli źródłem danych jest JSON), albo musisz mieć konwerter, który przerobi ci stringa na Uri.

Jeżeli wybierzesz drugie (bardziej skomplikowane podejście prawdopodobnie), to konwerter będzie wyglądał jakoś tak:

class StringToUriConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return new Uri(value as string);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return value;
    }
}

A z kolei w XAML-u musisz go mieć w Resources swojej strony oraz odpowiednio w Bindingu w twoim MediaElement

<Page.Resources>
    <local:StringToUriConverter x:Key="StringToUriConverter" />
</Page.Resources>
<MediaElement x:Name="media" Source="{Binding MyProperty, Converter={StaticResource StringToUriConverter}}" AutoPlay="True"></MediaElement>

I nie możesz napisać po prostu "Assets/plik.mp4" jeżeli chcesz się odwołać do pliku wewnątrz twojej paczki aplikacji - to musi być poprawne URI. Musisz użyć ms-appx, na przykład: ms-appx:///Assets/plik.mp4.

0

No faktycznie masz racje. Pokombinuje. Dam znać co z tego wyjdzie :) Dzięki za pomoc Wesołych Świąt :)

0

Niestety Próba zmiana stringa na Uri nie podziałała. Zostaje konwerter.

0

Kombinuje teraz z converterem. Gdzie powinienem go wrzucić? w ten sposób?

 using Centrum_Seriali.Common;
using Centrum_Seriali.Data;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using System.Windows.Input;
using Windows.Data.Json;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// Szablon elementu Strona podziału jest udokumentowany pod adresem http://go.microsoft.com/fwlink/?LinkId=234234

namespace Centrum_Seriali
{
    class StringToUriConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            return new Uri(value as string);
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            return value;
        }
    }
    /// <summary>
    /// Strona, która wyświetla tytuł grupy, listę elementów w obrębie grupy i szczegóły dla
    /// zaznaczonego obecnie elementu.
    /// </summary>
    public sealed partial class SplitPage : Page
    {
        private NavigationHelper navigationHelper;
        private ObservableDictionary defaultViewModel = new ObservableDictionary();

        /// <summary>
        /// NavigationHelper jest używany na każdej stronie do pomocy w nawigacji oraz 
        /// zarządzanie okresem istnienia procesu
        /// </summary>
        public NavigationHelper NavigationHelper
        {
            get { return this.navigationHelper; }
        }

        /// <summary>
        /// Można to zmienić na model widoku o silnym typowaniu.
        /// </summary>
        public ObservableDictionary DefaultViewModel
        {
            get { return this.defaultViewModel; }
        }

        public SplitPage()
        {
            this.InitializeComponent();

            // Konfiguruj pomocnika nawigacji
            this.navigationHelper = new NavigationHelper(this);
            this.navigationHelper.LoadState += navigationHelper_LoadState;
            this.navigationHelper.SaveState += navigationHelper_SaveState;

            // Konfiguruj logiczne składniki nawigacji między stronami które pozwalają
            // strona do wyświetlania tylko jednego okienka w tym samym czasie.
            this.navigationHelper.GoBackCommand = new RelayCommand(() => this.GoBack(), () => this.CanGoBack());
            this.itemListView.SelectionChanged += ItemListView_SelectionChanged;

            // Rozpocznij nasłuchiwanie zmian rozmiaru okna 
            // aby zmienić z wyświetlania dwóch okienek do wyświetlania jednego okienka
            Window.Current.SizeChanged += Window_SizeChanged;
            this.InvalidateVisualState();

            this.Unloaded += SplitPage_Unloaded;
        }

        /// <summary>
        /// Zwolnij obsługę zdarzenia SizedChanged, gdy nastąpi usunięcie z pamięci klasy SplitPage.
        /// </summary>
        private void SplitPage_Unloaded(object sender, RoutedEventArgs e)
        {
            Window.Current.SizeChanged -= Window_SizeChanged;
        }

        /// <summary>
        /// Wypełnia stronę zawartością przekazywaną podczas nawigowania. Dowolny zapisany stan jest również
        /// dostarczany podczas odtwarzania strony z poprzedniej sesji.
        /// </summary>
        /// <param name="sender">
        /// Źródło zdarzenia; zazwyczaj jest to <see cref="Common.NavigationHelper"/>
        /// </param>
        /// <param name="e">Dane zdarzenia, które dostarczają obu parametrów nawigacyjnych przekazanych do </param>
        /// <see cref="Frame.Navigate(Type, Object)"/>, gdy tej strony żądano po raz pierwszy i
        /// słownik stanu zachowanego przez tę stronę podczas wcześniejszej
        /// sesji.  Stan będzie równy null przy pierwszej wizycie na stronie.</param>
        private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
        {
            var group = await SampleDataSource.GetGroupAsync((String)e.NavigationParameter);
            this.DefaultViewModel["Group"] = group;
            this.DefaultViewModel["Items"] = group.Items;

            if (e.PageState == null)
            {
                this.itemListView.SelectedItem = null;
                // Gdy jest to nowa strona, wybierz pierwszy element automatycznie, chyba że jest używana logiczna
                // nawigacja stroną jest użyta (zobacz logiczną nawigację stroną #region poniżej.)
                if (!this.UsingLogicalPageNavigation() && this.itemsViewSource.View != null)
                {
                    this.itemsViewSource.View.MoveCurrentToFirst();
                }
            }
            else
            {
                // Przywróć poprzednio zapisany stan skojarzony z tą stroną
                if (e.PageState.ContainsKey("SelectedItem") && this.itemsViewSource.View != null)
                {
                    var selectedItem = await SampleDataSource.GetItemAsync((String)e.PageState["SelectedItem"]);
                    this.itemsViewSource.View.MoveCurrentTo(selectedItem);
                }
            }
        }

        /// <summary>
        /// Zachowuje stan skojarzony z tą stroną na wypadek wstrzymania aplikacji lub
        /// odrzucenia strony z buforu nawigacji. Wartości muszą spełniać wymogi
        /// wymagania <see cref="Common.SuspensionManager.SessionState"/>.
        /// </summary>
        /// <param name="navigationParameter"> Wartość parametru przekazywana do
        /// <see cref="Frame.Navigat(Type, Object)"/> , gdy tej strony żądano po raz pierwszy.
        /// </param>
        /// <param name="sender">Źródło zdarzenia; zazwyczaj jest to <see cref="Common.NavigationHelper"/></param>
        /// <param name="e">Dane zdarzenia zapewniające pusty słownik, który będzie zapełniony
        /// stanem, podlegającym serializacji.</param>
        private void navigationHelper_SaveState(object sender, SaveStateEventArgs e)
        {
            if (this.itemsViewSource.View != null)
            {
                var selectedItem = (Data.SampleDataItem)this.itemsViewSource.View.CurrentItem;
                if (selectedItem != null) e.PageState["SelectedItem"] = selectedItem.UniqueId;
            }
        }

        #region Strona logiczna nawigacji

        // Strona dzielona została zaprojektowana w taki sposób, że gdy okno nie ma wystarczająco dużo przestrzeni do pokazania
        // zarówno listy jak i szczegółów, pokazane zostanie tylko jedno okienko na raz.
        //
        // To wszystko jest implementowane za pomocą pojedynczej strony fizycznej, mogącej reprezentować dwie
        // strony logiczne.  Kod poniżej osiąga ten cel bez uświadamiania użytkownika
        // rozróżnienie.

        private const int MinimumWidthForSupportingTwoPanes = 768;

        /// <summary>
        /// Wywoływane w celu ustalenia, czy strona powinna zachowywać się jak jedna strona logiczna, czy jak dwie.
        /// </summary>
        /// <returns>True jeżeli okno powinno zachowywać się jak pojedyncza logiczna strona, false
        /// w przeciwnym razie.</returns>
        private bool UsingLogicalPageNavigation()
        {
            return Window.Current.Bounds.Width < MinimumWidthForSupportingTwoPanes;
        }

        /// <summary>
        /// Wywołane gdy okno zmienia rozmiar
        /// </summary>
        /// <param name="sender">Bieżące okno</param>
        /// <param name="e">Dane zdarzenia, opisujące nowy rozmiar okna</param>
        private void Window_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
        {
            this.InvalidateVisualState();
        }

        /// <summary>
        /// Wywoływane, gdy element na liście zostaje zaznaczony.
        /// </summary>
        /// <param name="e">Widok GridView wyświetlający wybrane elementy.</param>
        /// <param name="e">Dane zdarzenia, opisujące, jak zmieniło się zaznaczenie.</param>
        private async void ItemListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // Unieważnij stan widoku, kiedy nawigacja strony logicznej jest obowiązująca, jako że zmiana
            // w zaznaczeniu może powodować odpowiadającą jej zmianę w bieżącej stronie logicznej.  When
            // element jest zaznaczony, skutkuje to zmianą wyświetlania listy elementów
            // na pokazywanie szczegółów wybranego elementu.  Gdy zaznaczenie jest czyszczone, daje to
            // efekt odwrotny.

           
            if (itemListView.SelectedIndex == 0)
            {
                var load = new LoadSeriesText();

                string MonkeysSeriesText = await load.Load("MonkeysSeriesText.txt");

                textBlock_Series.Text = MonkeysSeriesText;
            }
            if (itemListView.SelectedIndex == 1)
            {
                var load = new LoadSeriesText();

                string AmericanHorrorText = await load.Load("AmericanHorrorSeriesText.txt");

                textBlock_Series.Text = AmericanHorrorText;
            }
            if (itemListView.SelectedIndex == 2)
            {
                var load = new LoadSeriesText();

                string ArrowText = await load.Load("ArrowSeriesText.txt");

                textBlock_Series.Text = ArrowText;
            }


            if (this.UsingLogicalPageNavigation()) this.InvalidateVisualState();
        }

        private bool CanGoBack()
        {
            if (this.UsingLogicalPageNavigation() && this.itemListView.SelectedItem != null)
            {
                return true;
            }
            else
            {
                return this.navigationHelper.CanGoBack();
            }
        }
        private void GoBack()
        {
            if (this.UsingLogicalPageNavigation() && this.itemListView.SelectedItem != null)
            {
                // Kiedy nawigacja strony logicznej jest obowiązująca i jest zaznaczony element, którego
                // szczegóły elementu są obecnie wyświetlane. Wyczyszczenie zaznaczenia powróci do
                // listy elementów. Z punktu widzenia użytkownika jest to logiczne "wstecz"
                // nawigacja wstecz.
                this.itemListView.SelectedItem = null;
            }
            else
            {
                this.navigationHelper.GoBack();
            }
        }

        private void InvalidateVisualState()
        {
            var visualState = DetermineVisualState();
            VisualStateManager.GoToState(this, visualState, false);
            this.navigationHelper.GoBackCommand.RaiseCanExecuteChanged();
        }

        /// <summary>
        /// Wywoływane, aby określić nazwę stanu wizualnego, który odpowiada
        /// stanowi widoku aplikacji.
        /// </summary>
        /// <returns>Nazwa żądanego stanu wizualnego.  Jest ona taka sama, jak nazwa
        /// stanu widoku, z wyjątkiem sytuacji, gdy zaznaczony jest element w widoku pionowym i przypiętym, gdzie
        /// dodatkowa strona logiczna jest reprezentowana przez dodanie sufiksu _Detail.</returns>
        private string DetermineVisualState()
        {
            if (!UsingLogicalPageNavigation())
                return "PrimaryView";

            // Aktualizuj włączony stan przycisku Wstecz po zmianie stanu widoku
            var logicalPageBack = this.UsingLogicalPageNavigation() && this.itemListView.SelectedItem != null;

            return logicalPageBack ? "SinglePane_Detail" : "SinglePane";
        }

        #endregion

        #region Rejestracja NavigationHelper

        /// Metody dostarczone w tej sekcji są używane do zezwolenia
        /// NavigationHelper aby odpowiedzieć metodą nawigacji strony.
        /// 
        /// Logika charakterystyczna dla strony powinna zostać umieszczona w obsłudze zdarzenia dla  
        /// <see cref="Common.NavigationHelper.LoadState"/>
        /// i <see cref="Common.NavigationHelper.SaveState"/>.
        /// Parametr nawigacji jest dostępny w metodzie LoadState 
        /// w dodatku do stanu strony zachowanego podczas wcześniejszej sesji.

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            navigationHelper.OnNavigatedTo(e);
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            navigationHelper.OnNavigatedFrom(e);
        }

        #endregion

        private void PlayMedia(object sender, RoutedEventArgs e)
        {
            mediaElement.Play();
        }
        private void PauseMedia(object sender, RoutedEventArgs e)
        {
            mediaElement.Pause();
        }
        private void StopMedia(object sender, RoutedEventArgs e)
        {
            mediaElement.Stop();

        }      
    }   
}

Dodając go do xaml strony niestety podkreśla go z komunikatem : "Nazwa StringToUriConverter nie istnieje w przestrzeni nazw using:Centrum_Seriali.

 <Page.Resources>
        <!-- Kolekcja elementów wyświetlanych przez tę stronę -->
        <local:StringToUriConverter x:Key="StringToUriConverter"/>
        <CollectionViewSource             
            x:Name="itemsViewSource"
            Source="{Binding Items}"
            d:Source="{Binding Groups[0].Items, Source={d:DesignData Source=/DataModel/SampleData.json, Type=data:SampleDataSource}}"/>
    </Page.Resources>
0

Przebuduj projekt, przestanie go podkreślać. Nie, serio - w momencie, kiedy VS zauważy, że jednak w Centrum_Seriali istnieje sobie klasa StringToUriConverter to będzie działać :-)

0

No i wszystko trybi :) Przestało go podkreślać. Wystarczyło zdebugować. Filmy ładują się poprawnie. Nie musiałem nawet nic do blidingu w mediaElement dodawać. Dzięki wielkie za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1