Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DirectSound и воспроизведение аудио из интернета 
V
    Опции темы
Benedicttt
Дата 31.1.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 31.1.2011

Репутация: нет
Всего: нет



Задача на первый взгляд тривиальна - надо воспроизводить аудио из интернета.
Допустим есть Url с mp3 аудиотреком,я могу получить поток стандартными httpWebReqest, HhtpWebResponse, а вот дальше как?
Понятно что можно сохранить в файл и после воспроизводить - так не пойдет, надо чтобы воспроизводило одновременно с загрузкой.
Я знаю про существование соответсвующих компонентов в windows forms и WPF, которые вроде так могут - это не годится, задача стоит так чтобы я мог всегда знать сколько загружено, чтобы как-то это отображать.

Смотрел и класс Audio из Microsoft.DirectX.AudioVideoPlayback - по тем же причинам не утсраивает

Остановился я на классах Buffer и SecondaryBuffer из Microsoft.DirectX.DirectSound. Вроде как могут играть потоки, вроде как все тонко настраивается, только беда в том что простой поток, полученый HhtpWebResponse играть они не хотят - возникает исключение, в котором мне сообщают что мой поток (класс Stream) должен поддерживать метод Seek.


вот пример -
Код

        public void playUrl(string url, Window ownerWindow) {
            HttpWebResponse response = (HttpWebResponse)WebRequest.Create(url).GetResponse();
            Stream audioTrack = response.GetResponseStream();
            int streamLength;
            int.TryParse(response.Headers.Get("Content-Length"),out streamLength);

            Device dev = new Device();
            dev.SetCooperativeLevel(new System.Windows.Interop.WindowInteropHelper(ownerWindow).Handle, CooperativeLevel.Normal);

            SecondaryBuffer playBuf = new SecondaryBuffer(audioTrack, streamLength, dev);
            playBuf.Play(0, BufferPlayFlags.Default);
        }
    
    

исключение происходит при вызове конструктора SecondaryBuffer
вот такое - 
Цитата

System.NotSupportedException не обработано
  Message=This stream does not support seek operations.
  Source=System
  StackTrace:
       at System.Net.ConnectStream.get_Length()
       at Microsoft.DirectX.DirectSound.Buffer.CreateBufferFromStream(Stream source, Int32 length, BufferDescription desc, Device parent)
       at Microsoft.DirectX.DirectSound.SecondaryBuffer..ctor(Stream source, Int32 length, Device parent)
       at VK_LastFmWpfPlayer.MediaPlayer.playUrl(String url, Window ownerWindow)
  ...

        
ну и собственно вопрос - как сделать, чтобы играло? smile 
первое, что приходит в голову - может запустить асинхронное копирование из полученого потока в какой-то другой, например в MemoryStream и играть его?

может кто-нибудь подобное делал с использованием этих классов? поделитесь опытом, пожалуйста, 4 дня голову ломаю.
или может есть какие-то другие средства?
PM MAIL   Вверх
Benedicttt
Дата 4.2.2011, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 31.1.2011

Репутация: нет
Всего: нет



Вопрос закрыт -  нашел альтернативное решение - библиотека Bass. Пожалуй это даже больше чем искал  smile 

Вот так вот просто я воспроизвожу:
Код

        public void playUrl(string url) {
            Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero);
            channel = Bass.BASS_StreamCreateURL(url, 0,BASSFlag.BASS_DEFAULT, null, IntPtr.Zero);
            Bass.BASS_ChannelPlay(channel, false);
        }


а вот так получаю информацию о том сколько загружено:

Код

        public long getDownloadProgress() {
            return Bass.BASS_StreamGetFilePosition(channel, BASSStreamFilePosition.BASS_FILEPOS_DOWNLOAD);
        }

            
+возможности библиотеки позволяют делать еще кучу интереснейших вещей
PM MAIL   Вверх
Georgich
Дата 4.2.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 20.1.2008

Репутация: нет
Всего: нет



Benedicttt, спасибо.
Я тоже занимаюсь этим вопросом и пока забуксовал. Пытался использовать NAudio, но, если воспроизвести файл из интернета так просто библиотекой Bass, то, неприменно, воспользуюсь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0416 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.