2009-08-31 3 views
0

этот вопрос вытекает из моей предыдущей нити Play mp3 from internet without FileOpenDialogNAudio - «WaveOut» не содержит конструктор, который принимает аргументы «3»

Я действительно надеюсь, что кто-то знает что-нибудь об этом. Мне сказали использовать WebRequest, чтобы запустить поток загрузки, а затем воспроизвести поток вместо того, чтобы воспроизводить локально сохраненный файл. Однако, пытаясь использовать код из PlayMp3FromUrl дает мне эту ошибку:

«„NAudio.Wave.WaveOut“не содержит конструктор, который принимает аргументы„3“»

Компиляция failes на этой линии:

using (WaveOut waveOut = new WaveOut(0, 500, null)) 

Это полный код:

public static void PlayMp3FromUrl(string url) 
    { 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (Stream stream = WebRequest.Create(url) 
       .GetResponse().GetResponseStream()) 
      { 
       byte[] buffer = new byte[32768]; 
       int read; 
       while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        ms.Write(buffer, 0, read); 
       } 
      } 

      ms.Position = 0; 

      using (WaveStream blockAlignedStream = 
       new BlockAlignReductionStream(
        WaveFormatConversionStream.CreatePcmStream(
         new Mp3FileReader(ms)))) 
      { 
       using (WaveOut waveOut = new WaveOut(0, 500, null)) 
       { 
        waveOut.Init(blockAlignedStream); 
        waveOut.Play(); 
        while (blockAlignedStream.Position < blockAlignedStream.Length) 
        { 
         System.Threading.Thread.Sleep(100); 
        } 
       } 
      } 
     } 
    } 

Может кто-то помочь мне выяснить, какие доводы WaveOut принимает?

Редактировать: Вы, вероятно, захотите посмотреть на WaveOut.cs, и это довольно долго. Так что просто посмотреть на него здесь WaveOut.cs

ответ

0

Вы проходящие три аргумента конструктору WaveOut: 0, 500, нулевой, но там нет конструктора по классу WaveOut, который принимает, что много аргументов.

Почему вы передаете три аргумента конструктору WaveOut?

+0

Это потому, что код выглядит так, как это сделал человек, который его написал, в этой статье Stackoverflow: http://stackoverflow.com/questions/184683/play-audio-from-a-stream-using-c –

+0

Я предполагаю, что WaveOut.cs изменился или что-то с тех пор. Но я не могу понять, какие аргументы должны пройти. –

1

Я никогда не использовал класс всплесков, я бы предложил использовать DirectX, если можно.

using (IWavePlayer directOut = new DirectSoundOut(300))    
{      
    directOut.Init(blockAlignedStream);      
    directOut.Play();      
    while (blockAlignedStream.Position < blockAlignedStream.Length) 
    {      
     System.Threading.Thread.Sleep(100);      
    }     
} 
+0

Вау, это действительно работает :) Но программа все еще зависает (во время воспроизведения mp3-файла), что может быть причиной этой проблемы? Сложно отлаживать, так как в коде много вещей. И я не могу сказать, что может вызвать это. –

+2

Ваш цикл while блокирует вашу программу. Сделайте игроком поле класса и запустите в него команды запуска остановки или позаботьтесь об этом в другом потоке. – Will

+0

Хорошо, я понятия не имею, как это сделать. Это потребует много изменений? И еще, знаете ли вы, как поток хранится локально? Будет ли я воспроизводить загруженный кеш или повторить загрузку независимо от того, что? Мне бы очень понравился какой-то кеш.Как и OpenFileDialog, он сам по себе. Насколько это возможно, насколько это возможно? И да, я сосать на C# .. Я пытался это сделать с VB.NET, но я столкнулся с трудностями. Поэтому я решил попробовать исходный исходный код C#. –

1

Просто используйте конструктор по умолчанию (без параметров). Самый последний код NAudio имеет свойства в классе WaveOut вместо старого конструктора с 3 параметрами. Если это вызывает множество проблем, я могу вернуть старый конструктор и пометить его атрибутом [Устаревший].

Первым параметром был номер устройства. 0 означает использование устройства по умолчанию.

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

Третий способ связан с механизмом обратного вызова для waveOut. К сожалению, нет единого решения для всех вариантов. Если вы передадите значение null, NAudio будет использовать функции обратных вызовов, но это может зависать на некоторых аудио-наборах микросхем. Лучше передать ручку окна, если это вообще возможно.

+0

Привет, Марк! Я уже пытался использовать никакие параметры. И это заставляет форму полностью замораживать. И воспроизведение, похоже, не работает. Использование DirectSoundOut также замораживает форму, но воспроизведение работает примерно через 3-4 секунды или около того. К сожалению, я полный придурок, поэтому я не знаю, как передать дескриптор окна. Я думаю, что знаю, что это значит, вы что-то писали в документации или подобном. Но я не знаю, как это сделать по причине, указанной выше. –

 Смежные вопросы

  • Нет связанных вопросов^_^