Может кто-нибудь поделиться со мной НАДЕЖНЫМ способом записи звука на всех устройствах с помощью MediaRecorder? Я просто пытаюсь записать аудиофайл в формате AMR с низким битрейтом, который, согласно Google, является стандартным для всех устройств. Это куча дерьма.
По моему опыту, есть много устройств, планшетов и т. д., не принадлежащих к какой-либо торговой марке, которые будут ужасно давать сбои при использовании AudioEncoder.AMR_NB по умолчанию. Мой обходной путь в настоящее время состоит в том, чтобы использовать отражение для опроса кодировщиков в суперклассе, а затем перебирать каждый из них с помощью прослушивателя ошибок, чтобы увидеть, какой из них не дает сбой. Это не только не изящно, но и не улавливает все устройства. Я также попытался установить значения по умолчанию для параметров AudioEncoder и OutputFormat (константа 0), и на некоторых устройствах это также ужасно не работает.
Вот что я использую, если кодировщик AMR по умолчанию не работает:
Class encoderClass = MediaRecorder.AudioEncoder.class;
Field[] encoders = encoderClass.getFields();
Затем я перебираю каждый кодировщик, устанавливая прослушиватель ошибок. Если он заканчивается успешно, я устанавливаю его в качестве кодировщика по умолчанию в качестве настройки.
for (int i = j; i < encoders.length; i++) {
try {
int enc = encoders[i].getInt(null);
recorder.reset();
recorder.setAudioSource(AudioSource.MIC);
recorder.setOutputFormat(OutputFormat.THREE_GPP);
recorder.setAudioEncoder(enc); //testing the encoder const here
recorder.setOutputFile(amrPath);
recorder.setMaxDuration(3000);
recorder.setOnInfoListener(new OnInfoListener() {
Я продолжаю цикл, если слушатель поймает ошибку:
if (arg1 == MediaRecorder.MEDIA_RECORDER_ERROR_UNKNOWN) {
Этот метод работает для большинства устройств. Что насчет остальных? У меня все еще есть устройства, которые проваливаются, и, честно говоря, я хотел бы что-то НАДЕЖНОЕ почти для всех устройств????