Отклонение частоты дискретизации и звуковая позиция воспроизведения - PullRequest
1 голос
/ 19 марта 2012

Когда вы устанавливаете скорость звуковой карты, например, 44100, вы не можете гарантировать, что фактическая скорость будет равна 44100. В моем случае измерения трафика между приложением и ALSA (в сэмплах / сек) дали мне значение 44066 ... 44084.

Это не должно быть связано с проблемами передискретизации: даже только 48000 аппаратуре необходимо «съесть» данные со скоростью 44100 в режиме «44100».

Проблема возникает, когда я пытаюсь навести курсор насигнал во время воспроизведения.Я вычисляю положение курсора, используя «идеальную» частоту дискретизации, считанную из WAV-файла (22050, ..., 44100, ..., 48000) и миллисекунды, проведенные после начала воспроизведения, используя следующую функцию C ++:

long long getCurrentTimeMs(void)
{
    boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
    boost::posix_time::ptime    epoch_start(boost::gregorian::date(1970,1,1));
    boost::posix_time::time_duration dur = now - epoch_start;
    return dur.total_milliseconds();
}

QTimer используется для генерации кадров для анимации курсора, но я не зависим от точности QTimer, потому что я запрашиваю время у getCurrentTimeMs () (предполагая, что это достаточно точно) для каждого кадра, поэтому я могу работать с переменной частотой кадров.

После 2-3 минут игры я вижу небольшую разницу между тем, что я слышу, и тем, что я вижу - позиция курсора больше, чем позиция воспроизведения, примерно на 1/20 секунды или около того.

Когдая измеряю трафик, который проходит через обратный вызов ALSA, я получаю среднее значение 44083,7 выборок / сек.Затем я использую это значение в функции рисования экрана в качестве фактической ставки.Теперь проблема исчезает.Программа кроссплатформенная, поэтому я протестирую эти измерения на Windows и другой звуковой карте позже.

Но есть ли лучший способ синхронизации звука и экрана?Есть ли какой-нибудь не очень ресурсоемкий способ запроса звуковой карты, например, о фактическом номере воспроизводимого семпла?

1 Ответ

2 голосов
/ 19 марта 2012

Это известный эффект, который описан здесь, например, в Windows с учётом согласования скорости, Живые источники .

При воспроизведении эффект обычно решается путем использования звукового оборудования в качестве «часов» и синхронизации с воспроизведением звука вместо «настоящих» часов. То есть, например, при частоте дискретизации звука 44100 следующий видеокадр видео с частотой 25 к / с представляется синхронно с воспроизведением сэмплирования 44100/25, а не с использованием приращения системного времени 1/25. Это компенсирует неточную эффективную скорость воспроизведения.

При захвате само оборудование работает так, как будто оно передает данные с точно запрошенной скоростью. Я думаю, что лучшее, что вы можете сделать, - это измерить эффективную частоту и изменить частоту аудио от эффективной до правильной частоты дискретизации.

...