Воспроизведение 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);
}
}
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= TRUE
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);