播放WriteableBufferingSource在5秒后加速

时间:2015-02-18 18:01:50

标签: c# libspotify cscore

我正在播放PCM RAW格式,并且播放音乐的前5秒,但在此之后,播放速度提高了两倍

我在这里做了什么: 我有一个带有事件处理程序的播放器类,当程序从一个位置接收一个字节时,它会添加到一个队列,并从该队列添加一个线程到缓冲区。

我得到的音乐来自spotify,使用libspotifydotnet,CSCore.Codecs.RAW.RawDataReader播放正确,但我不能继续在播放时向流中添加更多数据,或者我可以??? ???

这是我到目前为止所做的事情

    //Main.cs
    WasapiOut soundOut = new WasapiOut();
    soundOut.Initialize(Player.source);
    soundOut.Play();

...

   //Player.cs
    public static WriteableBufferingSource source;
    private static Queue<byte[]> _q = new Queue<byte[]>();

    source = new WriteableBufferingSource(new CSCore.WaveFormat(Session.format.sample_rate, 16, Session.format.channels, CSCore.AudioEncoding.Pcm));
    source.FillWithZeros = false;
    byte[] buffer = null;
    while (!_interrupt && !_complete)
    {
        if (_q.Count > 0)
        {
            buffer = _q.Dequeue();

            source.Write(buffer, 0, buffer.Length);
            System.Console.WriteLine("Buffer written {0} bytes", buffer.Length);
            Thread.Sleep(10);
        }
    }

    //New data downloaded event
    private static void Session_OnAudioDataArrived(byte[] buffer)
    {
        if (!_interrupt && !_complete)
        {
            _q.Enqueue(buffer);
        }
    }

2 个答案:

答案 0 :(得分:1)

首先,对不起我的英语,我也这样做,我检查播放器是否停止,你需要其中一个修复:

     while (!_interrupt && !_complete)
        {
            if (_q.Count > 0)
            {
                buffer = _q.Dequeue();
                source.Write(buffer, 0, buffer.Length);

// Check is playing
    if (soundOut.PlaybackState == PlaybackState.Stopped)
                    soundOut.Play();

                System.Console.WriteLine("Buffer written {0} bytes", buffer.Length);
                Thread.Sleep(10);
            }
        }

或者放

  

FillWithZeros =真

答案 1 :(得分:-1)

WriteableBufferingSource使用固定的缓冲区大小。如果缓冲区已满,则无法添加新数据,解决了缓冲区大小的问题。

CSCore.WaveFormat waveFormat = new CSCore.WaveFormat(Session.format.sample_rate, 16, Session.format.channels, CSCore.AudioEncoding.Pcm);

source = new WriteableBufferingSource(waveFormat, waveFormat.BytesPerSecond * 240);