Naudio C #: как мне точно синхронизировать секундомер с ходом воспроизведения звука? - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю над ритм-игрой, что означает, что я хочу, чтобы элементы экрана отображались в такт. Для этого я должен быть в состоянии сказать, где на временной шкале музыки я сейчас нахожусь. Я использую библиотеку Naudio (точнее, ASIO) и знаю, что могу позвонить в поле CurrentTime WaveStream, которое я сейчас играю, чтобы узнать, сколько времени прошло с момента начала воспроизведения музыки, однако это поле кажется не очень точным (по крайней мере, недостаточно точным, чтобы плавно отображать движущийся элемент экрана), поскольку это всего лишь приблизительное значение, основанное на средних байтах в секунду. вот почему я пытаюсь синхронизировать StopWatch с музыкой. Однако, что бы я ни пытался, я всегда получаю компенсацию. Моя текущая настройка работает так:

var audioFileReader = new AudioFileReader("music.mp3");
var waveChannel32 = new WaveChannel32(audioFileReader); //
var asioOut = new AsioOut(0);
var stopWatch = new Stopwatch();
asioOut.Init(waveChannel32);
asioOut.Play();
Task.Delay(1000).Wait();
waveChannel32.Position = 0;
stopWatch.Start();

Если я тогда сравниваю stopWatch.Elapsed с waveChannel32.CurrentTime, похоже, что stopWatch находится на месте (он прыгает на ~ 10 мс, потому что последний неточен, но в среднем они примерно равны. Если, однако, я сравниваю его с файлами из других ритм-игр (это примечание, в котором отметки времени отбивают удары), мой StopWatch оказывается на 50∓25 мс раньше. Теперь можно утверждать, что файлы могут быть неточными или что другие ритм-игры имеют смещения , но после проверки бесчисленных файлов в нескольких играх я чувствую себя не в силах сказать, что я исключил это.

Что является причиной моего смещения здесь и как я могу это исправить?

EDIT:

Я измеряю смещение следующим образом: всякий раз, когда я нажимаю клавишу, я играю щелкающий звук (известный как «hitount» в ритм-играх) и нажимаю на вкладку вместе с песней, пытаясь синхронизировать не мой ввод с клавиатуры, помещая полученный удар по звуку с бить и измерять мое среднее смещение. Таким образом, мне не нужно думать о задержке аппаратного и аудио драйвера. Конечно, я не робот и поэтому не совсем точен, но моя неточность обычно распространяется, поэтому я могу просто взять среднее и даже без этого я, по крайней мере, достаточно точен, чтобы сказать, что что-то не так.

...