Частотные данные AudioContext значительно отличаются от частотных данных OfflineAudioContext - PullRequest
0 голосов
/ 30 сентября 2019

Название в основном объясняет мою проблему. Я сравнивал данные о частоте, которые получены с помощью онлайн и офлайн аудио контекста. Кажется, они сильно отличаются, поэтому я собрал это MWE , чтобы показать разницу.

По сути, просто загрузите любой аудиофайл, и OfflineAudioContext немедленно его подберет и начнет рендеринг. Всякий раз, когда рендеринг достигнет 5 метки воспроизведения второй песни, он будет выводить данные текущей частоты. Как только OfflineAudioContext полностью завершит рендеринг, вы увидите обновленные элементы управления звуком на странице и сможете воспроизвести песню. Как только песня достигнет 5 секунд, используя онлайн AudioContext, данные частоты из этого анализатора будут выведены на экран.

Вы сможете увидеть, что данные частоты между ними, по крайней мере, дляпесни, которые я добавляю, сильно различаются. Не уверен, что я не полностью понимаю OfflineAudioContext или что это такое, но если кто-то сталкивался с чем-то подобным или имеет какие-либо идеи о том, что здесь происходит, я был бы признателен за любую информацию, которую вы могли бы дать.

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Если кто-нибудь сталкивался с тем же, я наконец понял, в чем проблема. Всякий раз, когда я создавал свой OfflineAudioContext, я неправильно его инициализировал. Я делал это

let offline = new OfflineAudioContext(2, 44100 * buffer.duration, 44100);

, когда я должен был делать

let offline = new OfflineAudioContext(buffer.numberOfChannels, buffer.length, buffer.sampleRate);

После того, как я сделал это изменение, значения данных о частоте между автономным контекстом и контекстом в реальном времени оказались намного ближевместе.

0 голосов
/ 30 сентября 2019

Если предположить, что ваш тестовый файл - это какой-то музыкальный файл, то я ожидаю, что результаты будут другими. Если вы не можете позвонить getByteFrequencyData в одно и то же время, вы получите другие результаты, потому что данные в AnalyserNode будут другими. А поскольку getByteFrequencyData вызывается из основного потока и должно получать данные из аудиопотока, довольно сложно точно знать, какие данные у вас есть.

Если вам нужно получить одинаковые данные как для автономного контекста, так и для автономного контекста. в контексте реального времени вы должны использовать ScriptProcessorNode или AudioWorkletNode, чтобы гарантировать, что вы получите данные о частоте одновременно. (Но будьте последовательны; используйте ScriptProcessorNode или AudioWorkletNode для обоих контекстов.)

...