Звуковые сигналы медиа-плеера Android забиваются / заикаются только на более новых устройствах

У меня довольно стандартный объект медиапланера, который запускается в onCreate и петли для фоновой музыки в моем приложении. Файл не необычно большой, это 6 МБ MP3. Из onCreate:

MediaPlayer mp; mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity); mp.setLooping(true); mp.setVolume(0.4f, 0.4f); mp.start(); 

Это очень хорошо работает на большинстве моих тестовых устройств, включая старые телефоны, планшет Samsung Galaxy Tab 2 10 "и даже Nexus 4.

К сожалению, я испытываю проблемы исключительно с более новыми устройствами, где я сталкиваюсь с сбоем звука / заиканием на Nexus 5 и новом Nexus 10. Эти проблемы ТОЛЬКО случаются на более новых устройствах, обычно после нескольких секунд правильного воспроизведения, а не сразу. Оба моих Nexus 4 и 5 работают под управлением Android 4.4.4, но проблема возникает только на Nexus 5.

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

Я читал, что более новые версии Android вызвали проблемы с Mediaplayer, но я не пришел к исправлению или предложению.

Кто-нибудь еще испытал эту проблему, кто может предложить исправить или обход? Спасибо за ваше время!

Я заметил, что это происходит и на моих Android-устройствах.

Я замечаю, что вы не вызываете Prepare (), которая является важной функцией перед воспроизведением звука. EDIT – вызов для подготовки необходим только при создании MediaPlayer с использованием нового, а не со встроенным MediaPlayer.Create ().

Что касается вашей проблемы при переключении между источниками, я предлагаю позвонить в SeekTo () точное время в аудио, которое вы хотите воспроизвести, и дождаться этой позиции с помощью слушателя SeekComplete. В комментариях у меня есть небольшая строка хакерского кода, которая не устанавливает громкость на медиаплеере до начала вызова. Кажется, это уменьшает заикание, но вы можете потерять первую небольшую часть звука.

Я использую Xamarin Studio C #, но даже если вы используете Java, этот же подход должен работать.

 MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.SetAudioStreamType (Android.Media.Stream.Music); mediaPlayer.SetDataSource ("dataSourcePath"); mediaPlayer.Looping = true; //It is necessary to call prepare after setting the data source mediaPlayer.Prepare (); //Ensure the audio has seeked to the position you need bool seekingComplete = false; mediaPlayer.SeekComplete += (object sender, EventArgs e) => { seekingComplete = true; }; mediaPlayer.SeekTo(0); //Forces the audio to complete seeking while(seekingComplete == false) { //Here, you just wait 2 milliseconds at a time //for this buffering and seeking to complete await Task.Delay(2); } mediaPlayer.Start(); //Hacky way to prevent the glitch sound at the start is to set the //volume after calling start //mediaPlayer.SetVolume(0.4f, 0.4f);