как установить скорость воспроизведения для звуков, генерируемых Android

Я использую класс AudioTrack и сгенерировал собственные тоны в своем приложении для Android. Однако я хочу иметь возможность контролировать скорость воспроизведения и не могу понять, как это сделать.

Я вижу метод setLoopPoints, но, похоже, он не делает то, что я хочу (если кто-то использовал его и может объяснить мне этот метод, что было бы здорово, документация по api мне не очень помогает).

Что я хочу сделать:

Когда точка (здесь прикосновение к экрану) приближается к цели на экране, я хочу увеличить скорость генерируемых тонов. Например, подальше я бы сказал, чтобы звуковой сигнал воспроизводился 1 раз в 1 секунду, но очень близко к цели, 5 раз за 1 секунду. Я изо всех сил пытаюсь найти лучший способ сделать это со звуками Android (сгенерированные тоны или даже файлы .wav, сохраненные в моем res / raw).

Любая помощь приветствуется!

Шани


person Shani    schedule 22.02.2011    source источник


Ответы (1)


Для этого вы хотите использовать метод setPlaybackRate:

http://developer.android.com/reference/android/media/AudioTrack.html

в сочетании с setLoopPoints. Тем не менее, я считаю, что, вероятно, существует предел того, насколько вы можете ускорить «естественную» скорость воспроизведения файла, и предел, вероятно, составляет 48 кГц (хотя я не уверен, и это может зависеть от устройства).

Итак, если у вас есть файл, который был записан, скажем, с частотой 8000 Гц, чтобы получить желаемый эффект, вы должны установить счетчик циклов на 4 (чтобы он воспроизводился 5 раз подряд) и установить скорость воспроизведения на 40 000 ( 5 * 8000).

Поскольку существует (вероятно) верхний предел скорости воспроизведения, лучшим подходом может быть запись исходного звука на высокой частоте и замедление воспроизведения по мере необходимости для достижения желаемого эффекта.

Обновление: setLoopPoints позволяет указать два произвольных местоположения в файле, так что, когда воспроизведение достигает точки конца цикла, звуковой движок возвращается к точке начала цикла. Чтобы зациклить весь файл, вы должны установить начальную точку цикла на 0, а конечную точку цикла на последний кадр в файле (размер каждого кадра зависит от формата файла, поэтому стереофайл, использующий 2 байта на образец, будет иметь размер кадра равен 4, поэтому последний кадр равен размеру аудиоданных в байтах, разделенных на 4).

Чтобы получить 5 последовательных воспроизведений вашего файла, вы должны установить счетчик циклов на 4 (счетчик циклов 0 означает, что файл воспроизводится один раз; -1 означает, что он будет повторяться вечно).

Обновление 2: просто прочтите еще немного документации - верхний предел для setPlaybackRate задокументирован как удвоенная частота, возвращаемая getNativeOutputSampleRate, которая для большинства устройств составляет, вероятно, 44 100 или 48 000 Гц. Это означает, что WAV-файл стандартного качества CD может воспроизводиться только со скоростью, вдвое превышающей обычную. Файл с частотой 22050 Гц можно было воспроизвести со скоростью, в 4 раза превышающей обычную, и т. Д.

person MusiGenesis    schedule 22.02.2011
comment
Спасибо за оперативный и подробный ответ - попробую! - person Shani; 23.02.2011
comment
Нет проблем - изучение этого материала в любом случае находится в моем списке TODO. Я знаю все о звуке в Windows, но я новичок в Android. Вам повезло: AudioTrack - очень разумный API, и его использование (относительно) простое и понятное. - person MusiGenesis; 23.02.2011