Изменение темпа/скорости воспроизведения Android

Я создаю приложение для Android, которое требует изменения скорости/скорости воспроизведения в реальном времени. Я искал по всему Интернету и видел множество решений, включая Учебные пособия по OpenSL ES для Android Как изменить темп звука и индивидуальность высоты тона, используя ffmpeg?

Поскольку я относительно новичок в разработке и Android, некоторые из них просто не в моем вкусе.

Многие из этих примеров говорят о Soundpool, но этот API не работает с большими файлами.

После просмотра API и классов я нашел метод setPlaybackRate(int sampleRateInHz) в классе AudioTrack. http://developer.android.com/reference/android/media/AudioTrack.html#setPlaybackRate(int)

Однако во всех этих онлайн-примерах ни один из них не упоминает об этом. Я что-то упустил и можно ли это использовать?

Любая помощь высоко ценится


person Raymond Kelly    schedule 05.03.2014    source источник


Ответы (2)


Начиная с API 23, MediaPlayer может устанавливать скорость воспроизведения с помощью этот метод.

Класс MediaPlayer

public void setPlaybackParams (PlaybackParams params) Добавлено в уровне API 23

Устанавливает скорость воспроизведения с помощью PlaybackParams. Параметры params PlaybackParams: параметры воспроизведения. Выдает IllegalStateException, если внутренний движок проигрывателя не был инициализирован. IllegalArgumentException, если параметры не поддерживаются.

Образец кода:

MediaPlayer mp = ...; //Whatever
float speed = 0.75f;     
mp.setPlaybackParams(mp.getPlaybackParams().setSpeed(speed));
person Shishir Gupta    schedule 07.05.2016

setPlaybackRate() действительно можно использовать, но, вероятно, это не то, что вам нужно.

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

В настоящее время нет прямого Android API для растягивания времени. Эти алгоритмы очень сложны с точки зрения математики, и даже если бы вы могли закодировать их на Java, производительность была бы ужасной.

Лучший способ — найти реализацию на C++ с использованием JNI, и это, вероятно, будет включать такие библиотеки, как ffmpeg.

person Merlevede    schedule 06.03.2014
comment
Спасибо за ваш ответ Merlevede Я на самом деле не возражаю, если высота тона / частота замедляется или увеличивается, так что, возможно, это сработает. Я провел еще немного исследований и нашел несколько страниц, на которых упоминалось, что этот метод не работает с файлами MP3, что является большой проблемой, поскольку он будет использоваться с музыкальными файлами. Хорошо, я понятия не имею, как использовать JNI или что это такое, но я посмотрю. Спасибо за вашу помощь, и если у вас есть дополнительная информация, которая была бы очень признательна - person Raymond Kelly; 06.03.2014