NAudio C # Как сделать / контролировать количество байтов, прочитанных из IWavePlayer? - PullRequest
1 голос
/ 26 февраля 2011

У меня есть следующий код:

IWavePlayer player = new WaveOut();
WaveStream reader = new WaveFileReader(filePath);
WaveChannel32 input = new WaveChannel32(reader);

AmplitudeStream ampStream = new AmplitudeStream(input);
ampStream.AmplitudeEventHandler += new EventHandler<AmplitudeArgs>(AmplitudeStreamHandler);

player.Init(ampStream);
player.Play();

AmplitudeStream - это класс, который я создал и который реализует WaveStream, так что я могу «отслеживать» и отправлять событие всякий раз, когда данные считываются из файла. Однако моя проблема в том, что я хочу контролировать, сколько байтов читается. Так как функция Read AmplitudeStream вызывается функцией Play (), я понятия не имею, как я могу ограничить число считываемых байтов (это всегда 35,280).

Как это сделать? Я использую команду Play (), потому что я хочу, чтобы мой файл воспроизводился, чтобы я мог наблюдать. Так что, если есть другой способ воспроизвести файл во время команды Read (), он будет выглядеть примерно так:

byte[] buffer = byte[8192]
int bytesRead = 0;

do{

bytesRead = ampStream.Read(buffer,0,buffer.Length);

}while(bytesRead != 0);

@override
private int Read(byte[] buffer, int offset, int count)
{

//some command to play the file here

}

Я бы хотел знать. Спасибо! Кроме этого, есть ли способ не использовать класс WaveChannel32 в качестве входных данных для моего AmplitudeStream?

1 Ответ

2 голосов
/ 28 февраля 2011

посмотрите в демонстрации NAudio, как выполняется рисование формы волны, так как это звучит именно так, как вы хотите.Он по существу перехватывает чтение и отправляет событие каждые n выборок, на которые может подписаться код чертежа.

Обновление количество прочитанных байтов является функцией задержки воспроизведения - меньшая задержка =меньше байт прочитано.Если ваш исходный поток может быть прочитан только с размером блока 8192, я бы хотел ввести промежуточный поток буферизации.

...