locked
Проигрыватель для Win8 RRS feed

  • Вопрос

  • Добрый день, уважаемые коллеги,

    я начал разбираться с разработкой приложений для Windows 8 (store), язык С# знаю пока на базовом уровне, для примера решил создать медиа плеер с помощью класса MediaElement, но программа не работает, хотя ошибок нет.

    Содержимое файла MainPage.xaml.cs:

    2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
    public sealed partial class MainPage : Page
        {
            MediaElement Player;
            const string File = @"C:\Users\Anton\Desktop\test.mp3";
     
            public MainPage()
            {
                this.InitializeComponent();
                Player = new MediaElement();
            }
            
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
            }
     
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                if (Player.CurrentState != MediaElementState.Playing)
                {
                    Player.Source = new Uri(File);
     
                    Player.Play();
                }
                else if (Player.CurrentState == MediaElementState.Playing)
                {
                    Player.Pause();
                }
            }
        }

    Как видно из данного кода, кликом по кнопке происходит присваивание адреса свойству объекта Player и запускается метод Play(),

    сама кнопка определена в файле MainPage.xaml так:

    <StackPanel Grid.Column="1" HorizontalAlignment="Center" Orientation="Horizontal">
                        <Button x:Name="PlayButton" Style="{StaticResource PlayAppBarButtonStyle}" Click="Button_Click_1"/>
                </StackPanel>

    То есть на событие Click подписан метод Button_Click_1.

    Проблема: файл не начинает играть, исключений нет, компилятор не ругается.

    Что не так с кодом?

    • Изменено Andev 12 апреля 2013 г. 19:40
    12 апреля 2013 г. 18:24

Ответы

  • в общем как я решил проблему, та кнопка, которая в первом коде определяла адрес потока и запускала плеер, создана в аппбаре, я создал новую кнопку на самой странице только для определения адреса потока, а методы Play и Pause оставил для кнопки в аппбаре, в итоге работает:) надо будет детально разобрать эту ситуацию
    13 апреля 2013 г. 17:08
  • коллеги, в ходе экспериментирования, выяснилось, что плеер не играет некоторые потоки, которые работают только из браузера

    url - адрес потока, например http://mp3.rusradio.ru:8000/rusradio

    получился примерно такой код:

    WebRequest request = WebRequest.Create(url);
    WebResponse response = await request.GetResponseAsync();
    StreamReader sr = new StreamReader(response.GetResponseStream());


    судя по всему надо использовать метод MediaElement.SetSource Method (Stream),

    данный метод требует два параметра, к сожалению компилятор говорит об ошибках, если делать так:

                string mimetype = "audio/mpeg";
                Player.SetSource(sr, mimetype);

    кто может подсказать, как правильно составить запрос к медиа?






    Привет

    Только что проверил ссылку - поток играет, возможно это была временная неполадка на самом радио.

    Простейший код работает:

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                MediaElement1.Source = new Uri("http://mp3.rusradio.ru:8000/rusradio");
                MediaElement1.Play();
            }
    В случае с SetSource вы должны передать особый поток данных IRandomAccessStream, пример конвертации одного потока в другой можете найти здесь - Is there a way to convert a System.IO.Stream to a Windows.Storage.Streams.IRandomAccessStream?

    Для связи [mail]

    • Предложено в качестве ответа Abolmasov Dmitry 15 апреля 2013 г. 17:52
    • Помечено в качестве ответа Andev 16 апреля 2013 г. 6:07
    15 апреля 2013 г. 17:52

Все ответы

  • Могу ошибаться, сам не пробовал, но кажется проблема в том, что MediaElement визуальный элемент и должен располагаться в дереве элементов. Добавить его туда можно через XAML или через код (ваш код его в дерево не помещает). А вообще вот раздел посвященный работе с мультимедиа в Windows Store App.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    12 апреля 2013 г. 19:08
  • Могу ошибаться, сам не пробовал, но кажется проблема в том, что MediaElement визуальный элемент и должен располагаться в дереве элементов. Добавить его туда можно через XAML или через код (ваш код его в дерево не помещает). А вообще вот раздел посвященный работе с мультимедиа в Windows Store App.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    спасибо за ссылку, 

    я пробовал и такой вариант из XAML, он даже был первым, но тоже не работает, вот измененный MainPage.xaml.cs

    public sealed partial class MainPage : Page
        {
    
            const string File = @"C:\Temp\test.mp3";
    
            public MainPage()
            {
                this.InitializeComponent();
            }
            
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                if (Player.CurrentState != MediaElementState.Playing)
                {
                    Player.Source = new Uri(File);
                    Player.Play();
                }
                else if (Player.CurrentState == MediaElementState.Playing)
                {
                    Player.Pause();
                }
            }
        }

    а объект Player создается в XAML разметке:

    <MediaElement Name='Player' AutoPlay='False'></MediaElement>

    но разницы нет, также не играет



    • Изменено Andev 12 апреля 2013 г. 19:32
    12 апреля 2013 г. 19:31
  • Цитата: "Свойство Source задает файл мультимедиа для воспроизведения. Этот файл может находиться в сети или локальной системе, а также может входить в состав приложения. В случае файлов, находящихся в сети или входящих в состав приложения, достаточно задать для свойства Source путь к файлу. Для открытия файлов в локальной системе можно использовать объект FileOpenPicker."
    12 апреля 2013 г. 19:33
  • Цитата: "Свойство Source задает файл мультимедиа для воспроизведения. Этот файл может находиться в сети или локальной системе, а также может входить в состав приложения. В случае файлов, находящихся в сети или входящих в состав приложения, достаточно задать для свойства Source путь к файлу. Для открытия файлов в локальной системе можно использовать объект FileOpenPicker."

    спасибо за ответ, добавил сетевую ссылку, такой код тоже не работает

    public sealed partial class MainPage : Page
        {
    
            const string File = "http://94.25.53.133:80/nashe-192";
    
            public MainPage()
            {
                this.InitializeComponent();
            }
            
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                if (Player.CurrentState != MediaElementState.Playing)
                {
                    Player.Source = new Uri(File);
                    Player.Play();
                }
                else if (Player.CurrentState == MediaElementState.Playing)
                {
                    Player.Pause();
                }
            }
        }

    12 апреля 2013 г. 20:54
  • в общем как я решил проблему, та кнопка, которая в первом коде определяла адрес потока и запускала плеер, создана в аппбаре, я создал новую кнопку на самой странице только для определения адреса потока, а методы Play и Pause оставил для кнопки в аппбаре, в итоге работает:) надо будет детально разобрать эту ситуацию
    13 апреля 2013 г. 17:08
  • коллеги, в ходе экспериментирования, выяснилось, что плеер не играет некоторые потоки, которые работают только из браузера

    url - адрес потока, например http://mp3.rusradio.ru:8000/rusradio

    получился примерно такой код:

    WebRequest request = WebRequest.Create(url);
    WebResponse response = await request.GetResponseAsync();
    StreamReader sr = new StreamReader(response.GetResponseStream());


    судя по всему надо использовать метод MediaElement.SetSource Method (Stream),

    данный метод требует два параметра, к сожалению компилятор говорит об ошибках, если делать так:

                string mimetype = "audio/mpeg";
                Player.SetSource(sr, mimetype);

    кто может подсказать, как правильно составить запрос к медиа?






    • Изменено Andev 14 апреля 2013 г. 13:51
    14 апреля 2013 г. 10:03
  • Привет,

    Можетe посмотреть в данной теме, как выполняют SetSource:

    Loading file to player using MediaElement.SetSource

    15 апреля 2013 г. 10:07
  • Привет,

    Можетe посмотреть в данной теме, как выполняют SetSource:

    Loading file to player using MediaElement.SetSource


    в той теме прямая ссылка на mp3 файл, который хотят открыть из библиотеки, с этим все ясно, а вот что делать с потоком из интернета, непонятно, все прогуглил, ничего найти не смог, либо я рою не в том направлении.
    15 апреля 2013 г. 10:54
  • коллеги, в ходе экспериментирования, выяснилось, что плеер не играет некоторые потоки, которые работают только из браузера

    url - адрес потока, например http://mp3.rusradio.ru:8000/rusradio

    получился примерно такой код:

    WebRequest request = WebRequest.Create(url);
    WebResponse response = await request.GetResponseAsync();
    StreamReader sr = new StreamReader(response.GetResponseStream());


    судя по всему надо использовать метод MediaElement.SetSource Method (Stream),

    данный метод требует два параметра, к сожалению компилятор говорит об ошибках, если делать так:

                string mimetype = "audio/mpeg";
                Player.SetSource(sr, mimetype);

    кто может подсказать, как правильно составить запрос к медиа?






    Привет

    Только что проверил ссылку - поток играет, возможно это была временная неполадка на самом радио.

    Простейший код работает:

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                MediaElement1.Source = new Uri("http://mp3.rusradio.ru:8000/rusradio");
                MediaElement1.Play();
            }
    В случае с SetSource вы должны передать особый поток данных IRandomAccessStream, пример конвертации одного потока в другой можете найти здесь - Is there a way to convert a System.IO.Stream to a Windows.Storage.Streams.IRandomAccessStream?

    Для связи [mail]

    • Предложено в качестве ответа Abolmasov Dmitry 15 апреля 2013 г. 17:52
    • Помечено в качестве ответа Andev 16 апреля 2013 г. 6:07
    15 апреля 2013 г. 17:52
  • Спасибо, Дмитрий! Вчера странную ситуацию заметил, запускаю приложение и ни один поток не работает из моего приложения, запустил приложение другого разработчика из магазина, тоже ничего не работает, при этом радио работало из классического приложения AIMP, перезапустил Win8, запускаю VS и приложение, и все работает...
    16 апреля 2013 г. 6:10