Naudio - «WaveOut» не содержит конструктора, который принимает «3» аргумента - PullRequest
0 голосов
/ 31 августа 2009

этот вопрос вытекает из моей предыдущей темы Воспроизведение mp3 из Интернета без FileOpenDialog

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

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

Компиляция ошибок в этой строке:

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

Ответы [ 3 ]

1 голос
/ 31 августа 2009

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

using (IWavePlayer directOut = new DirectSoundOut(300))               
{                    
   directOut.Init(blockAlignedStream);                    
   directOut.Play();                    
   while (blockAlignedStream.Position < blockAlignedStream.Length)
   {                       
      System.Threading.Thread.Sleep(100);                    
   }                
}
1 голос
/ 01 сентября 2009

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

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

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

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

0 голосов
/ 31 августа 2009

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

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

...