Воспроизведение WriteableBufferingSource ускоряется через 5 секунд

Я играю в формате 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);
        }
    }

person TLPNull    schedule 18.02.2015    source источник


Ответы (2)


Во-первых, извините за мой английский, я делаю то же самое и проверяю, что проигрыватель остановился, вам нужно одно из этих исправлений:

     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=истина

person Fernando Diaz Toledano    schedule 03.09.2015

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);
person TLPNull    schedule 20.02.2015