locked
Как воспроизвести аудио поток (WP7)? RRS feed

  • Вопрос

  • Пытаюсь воспроизвести радио вещание из интернета. Напрямую через MediaElement не дает никакого результата. Пытался и через запрос, но не уверен, что правильно делаю.

    private void Button_Click(object sender, RoutedEventArgs e)
     {
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://broadcast03.station.ru/rusradio?.wma");
      request.AllowReadStreamBuffering = false;
      request.Method = "GET";
      request.BeginGetResponse(new AsyncCallback(ReadAnswer), request);
     }
    
     void ReadAnswer(IAsyncResult res)
     {
      HttpWebRequest request = (HttpWebRequest)res.AsyncState;
      HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(res);
      Stream r = response.GetResponseStream();
    
      // Вот дальше не знаю что делать  
     }
    
    • Изменено matrostik 7 февраля 2011 г. 7:02
    6 февраля 2011 г. 19:04

Ответы

  • После длительных проверок удалось воспроизвести часть потоков:
    1) Некоторые просто не работали в эмуляторе, пришлось проверять на девайсе.
    2) Некоторые завелись после добавления к ссылке "?ext=.mp3".
    3) В некоторых ссылках помогла замена http на mms.
    4) Как и писалось ранее shoutcast-потоки MediaElement не проигрывает.
    5) Все ссылки пришлось перехватывать сторонней программой, так как в большинстве случаев возвращается плейлист ввиде xml.
    • Помечено в качестве ответа Abolmasov Dmitry 16 февраля 2011 г. 6:50
    15 февраля 2011 г. 20:21

Все ответы

  • Странно, что вариант с MediaElement у Вас не заработал. Вот такой код разметки у меня работает корректно:

    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
      <Grid>
        <MediaElement Source="http://broadcast03.station.ru/rusradio?.wma" />
      </Grid>
    </Window>
    
    

    6 февраля 2011 г. 20:38
  • Стандартными средствами содержимое Stream при помощи MediaElement в WPF не воспроизвести, метода SetSource(), как у аналогичного элемента в Silverlight, у него, к сожалению, нет.
    6 февраля 2011 г. 20:41
  • У меня и вот этот вариант не заработал:

     public Page1()
        {
          InitializeComponent();
          mediaElement = new MediaElement();
          LayoutRoot.Children.Add(mediaElement);
          mediaElement.Source = new Uri("http://broadcast03.station.ru/rusradio?.wma");
          //mediaElement.Source = new Uri("Audio/Stromae.mp3", UriKind.Relative);
          mediaElement.Play();
        }
    
    Хотя если, как источник поставить обычный мп3 файл, то все работает.
    6 февраля 2011 г. 20:50
  • Стандартными средствами содержимое Stream при помощи MediaElement в WPF не воспроизвести, метода SetSource(), как у аналогичного элемента в Silverlight, у него, к сожалению, нет.

    Но SetSource() требует IsolatedStorageFileStream
    6 февраля 2011 г. 20:57
  • Нужно установить свойство LoadedBehavior:

    MediaElement mediaElement = new MediaElement();
    LayoutRoot.Children.Add(mediaElement);
    mediaElement.LoadedBehavior = MediaState.Manual;
    mediaElement.Source = new Uri("http://broadcast03.station.ru/rusradio?.wma");
    mediaElement.Play();
    

    6 февраля 2011 г. 21:05
  • Нет, вроде бы, обычный System.IO.Stream. Подробнее — здесь .
    6 февраля 2011 г. 21:07
  •  

    Silverlight для Windows Phone:

     SetSource(System.IO.Stream) присутствует, но не поддерживается в Silverlight for Windows Phone.

    п.с. А вообще непонятно то нет то да

    Silverlight for Windows Phone

    Поддерживается в версии: Windows Phone OS 7.0

    6 февраля 2011 г. 21:11
  • Нужно установить свойство LoadedBehavior:

    mediaElement.LoadedBehavior = MediaState.Manual;
    
    

     


    это свойство отсутствует в Silverlight для Windows Phone
    6 февраля 2011 г. 21:16
  • А, ну так у Вас в вопросе не было указано про Silverlight для Windows Phone.

    Все ответы выше справедливы только для WPF.

    К сожалению, я не работал раньше с Windows Phone, не могу помочь.

    6 февраля 2011 г. 21:34
  • Спасибо, но уже читал статью и там воспроизведение файла уже сохраненного в телефоне, а с этим у меня проблемы нет.

    7 февраля 2011 г. 5:00
  • Вот здесь есть в точности такой же вопрос, как и у Вас. Сотрудник Microsoft ответил, что в Windows Phone 7 пока нет поддержки shoutcast-потоков и такую поддержку нужно реализовывать самостоятельно при помощи класса MediaStreamSource. В проекте ManagedMediaHelpers есть пример для Windows Phone 7, позволяющий воспроизводить shoutcast-потоки в формате mp3. Осталось лишь реализовать аналогичное для формата wma.
    7 февраля 2011 г. 5:39
  • А разве это shoutcast-поток?

    И я кстати и его уже пробовал, но тоже тишина в динамиках.

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

     string currentTrackUrl = this.m_station.CurrentTrackUrl;
        if ((this.m_station.Adjustments & Adjustments.MockMP3) == Adjustments.MockMP3)
        {
          currentTrackUrl = currentTrackUrl + "/File.mp3";
        }
        this.m_mediaPlayer.Source = new Uri(currentTrackUrl);
        this.m_mediaPlayer.Play();
    

    То есть просто используют MediaElement

     this.m_mediaPlayer = new MediaElement();
    

    Короче одни пляски с этим элементом

    7 февраля 2011 г. 6:21
  • Да, в этом обсуждении тоже упоминают о том, что MediaElement в WP7 определяет формат потока по расширению, и дописывание чего-то, вроде "?ext=.mp3" помогает в случае с MP3-потоком.

    Кстати, сервер broadcast03.station.ru анализирует HTTP-заголовки запроса, и если они не соответствуют ожидаемым (как это будет в примере в Вашем первом сообщении), он вернет список потоков (точно так же, как и программное обеспечение ShoutCast), в данном случае это:

     

    [Reference]
    Ref1=http://broadcast03.station.ru/rusradio?.wma&MSWMExt=.asf
    Ref2=http://66.231.176.36:80/rusradio?.wma&MSWMExt=.asf

     

    Я проверил заголовки, которые отправляет Windows Media Player для этого списка, они оказались вот такими:

     

    GET http://broadcast03.station.ru/rusradio?.wma&MSWMExt=.asf HTTP/1.1
    Accept: */*
    User-Agent: NSPlayer/12.0.7600.16385
    Host: broadcast03.station.ru
    Pragma: version11-enabled=1
    Pragma: no-cache,rate=1.000,stream-time=0,stream-offset=0:0,packet-num=4294967295,max-duration=0
    Pragma: packet-pair-experiment=1
    Pragma: pipeline-experiment=1
    Supported: com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.predstrm, com.microsoft.wm.startupprofile
    Pragma: xClientGUID={3300AD50-2C39-46c0-AE0A-4BE4F2D09208}
    Accept-Language: ru-RU, *;q=0.1

     

    На такой запрос возвращается уже не список ссылок, а корректный ASF-поток с content-type: application/vnd.ms.wms-hdr.asfv1.

    7 февраля 2011 г. 9:24
  • [Reference]
    
    Ref1=http://broadcast03.station.ru/rusradio?.wma&MSWMExt=.asf
    
    Ref2=http://66.231.176.36:80/rusradio?.wma&MSWMExt=.asf
    Да это именно то, что я получаю, как ответ на запрос. Вопрос в том, как мне передать эти заголовки через MediaElement ? или может попытаться передать запрос через HttpWebRequest или через WebClient? 
    7 февраля 2011 г. 10:57
  • Нет, вручную через HttpWebRequest не нужно, если Вы, конечно, не планируете и воспроизведение реализовывать полностью самостоятельно.

    Продолжим эксперименты. Попробуйте выполнить следующие действия:

    • установите IIS Smooth Streaming Client ;
    • подключите к проекту сборку Microsoft.Web.Media.SmoothStreaming.dll;
    • добавьте в раздел объявлений XAML строку
      xmlns:smooth="clr-namespace:Microsoft.Web.Media.SmoothStreaming;assembly=Microsoft.Web.Media.SmoothStreaming"
      
    • добавьте в XAML-код вот такой элемент:
      <smooth:SmoothStreamingMediaElement AutoPlay="True" Source="http://broadcast03.station.ru/rusradio?.wma&MSWMExt=.asf"/>
      
    • и сообщите о результатах в этой теме.
    Сам я проверить не могу, так как на этом компьютере не установлены Windows Phone Developer Tools.
    7 февраля 2011 г. 11:28
  • И с этим клиентом я уже колдовал удалось только проиграть какой-то индийский стрим, но ради спортивного интереса попробую еще раз.

    Я правда использовал версию 1.5

    7 февраля 2011 г. 11:55
  •  <ss:SmoothStreamingMediaElement AutoPlay="True" Source="http://broadcast03.station.ru/rusradio?.mp3" />
    

    Эта ссылка работать не хочет, но эта http://online-hitfm.tavrmedia.ua:7000/HitFM начинает проигрываться прямо из дизайнера, то есть сразу после вставки.

    А вот эта http://www.geethamradio.com:8020/hifi.mp3.m3u только после запуска в эмуляторе.

    <ss:SmoothStreamingMediaElement AutoPlay="True" SmoothStreamingSource="" />
    
    Такой вариант вообще не пашет.
    7 февраля 2011 г. 12:45
  • Установлю сегодня вечером Windows Phone Developer Tools, поэкспериментирую.
    7 февраля 2011 г. 13:38
  • А вы точно уверены что, возвращаемый радио формат asf поддерживается windows phone 7?

    Supported Media Codecs for Windows Phone

    Попробуйте найти и воспроизвести какое-нибудь другое радио с форматом asf.


    Для связи [mail]
    7 февраля 2011 г. 16:21
  • Для уверенности брал различные станции из списка станций, которые находятся в приложении, которое без проблем их проигрывает.

    Продолжение......

    И так в продолжение эксперимента, создал новый проект, в котором програмно создал MediaElement и подписался на CurrentStateChanged и начал просто подставлять ссылки, так вот есть ссылки ,которые работают (в основном те, что заканчиваются на ".mp3"), а есть ссылки, которые не рабоают и MediaElement статус меняется с Opening сразу на Closed.

    Рабочая: http://stream.loveradio.ru:8000/Loveradio_96_stereo.mp3
    Нерабочая: http://online-hitfm.tavrmedia.ua/HitFM_256

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

    П.С. А как узнать какой формат аудио дает сервер?

    • Изменено matrostik 8 февраля 2011 г. 13:35 Продолжение......
    7 февраля 2011 г. 17:05
  • SmoothStreamingMediaElement  поигрался с ним еще раз, но все тот же результат, он ведет себя так же как и MediaElement, то есть проигрывает теже самые потоки.

    Уже и не знаю, что предпринять.

    9 февраля 2011 г. 8:20
  • Нерабочая: http://online-hitfm.tavrmedia.ua/HitFM_256

    А если попробовать http://online-hitfm.tavrmedia.ua/HitFM_256?ext=.mp3 ?

     

    П.С. А как узнать какой формат аудио дает сервер?

    Можно воспользоваться любой программой-сниффером (я пользуюсь WireShark ), либо HttpWebRequest/HttpWebResponse и отладчик.
    9 февраля 2011 г. 8:37
  • Нерабочая: http://online-hitfm.tavrmedia.ua/HitFM_256

    А если попробовать http://online-hitfm.tavrmedia.ua/HitFM_256?ext=.mp3 ?

    И это тоже пробовал тот же результат.
    9 февраля 2011 г. 10:34
  • После длительных проверок удалось воспроизвести часть потоков:
    1) Некоторые просто не работали в эмуляторе, пришлось проверять на девайсе.
    2) Некоторые завелись после добавления к ссылке "?ext=.mp3".
    3) В некоторых ссылках помогла замена http на mms.
    4) Как и писалось ранее shoutcast-потоки MediaElement не проигрывает.
    5) Все ссылки пришлось перехватывать сторонней программой, так как в большинстве случаев возвращается плейлист ввиде xml.
    • Помечено в качестве ответа Abolmasov Dmitry 16 февраля 2011 г. 6:50
    15 февраля 2011 г. 20:21
  • Столкнулся с такой же дилемой, Вы нашли решение?
    7 сентября 2014 г. 21:14