В детстве у меня был проигрыватель для виниловых пластинок с изменяемой скоростью проигрывания. Обычный диск на 33 оборота можно было запустить на 45 — уже получалось смешно. А можно было зафигачить аж на 78 оборотов — тогда пластинка проигрывалась очень быстро, и всё звучало по-мультяшному. По башке, конечно, надо было мне дать, чтобы пластинки не портил, но что было, то прошло. У меня сейчас тоже проигрыватель пластинок есть, но такой дурью я больше не маюсь. Просто играю пластинки и всё.
Так вот, всегда мучал вопрос — как это ютупчик и прочие сервисы видео- и аудиоконтента, типа подкастов, могут убыстрять (или замедлять) проигрывание звука без изменения его высоты?
Оказалось, что делают так:
1. Разбивают цифровой звук на маленькие блоки в 512-2048 байт. На частоте дискретизации в 44.1 килогерца эти блоки имеют длину всего несколько миллисекунд.
2. На каждом блоке запускают преобразование Фурье. Для тех, кто вдруг не знает — это математический способ разбить звук на индивидуальные составляющие частоты.
3. Воссоздают те же частоты, но просто укорачивают или увеличивают им длину проигрывания в нужное количество раз по желанию пользователя. Склеивают звук назад.
PROFIT!
Ну, немного посложнее, конечно (обычно там не тупо дискретные блоки по 512 байт, а т.н. “скользящее окно” (sliding window) размером в 512 байт, например, но основа алгоритма Phase Vocoder (“фазовый вокодер”, что ли?) именно такая.
Прикольно. Неужели всё это делается прямо в браузере, джаваскриптом? Обалдеть. Наврядли на сервере хранятся сто разных версий одного и того же видеофайла.