2015-01-19 8 views
6

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

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

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

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

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

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

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

+0

У вас есть решение проблемы? –

+0

Нет, к сожалению. – regomar

ответ

0

Я заметил, что это происходит и на устройствах 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); 
+0

Вызов 'MediaPlayer.create()' автоматически подготавливает аудио. Вы определенно не должны называть его снова. Из документов: «Удобный метод для создания MediaPlayer для данного Uri В случае успеха, подготовить() уже были названы и не должны вызываться снова.» –

 Смежные вопросы

  • Нет связанных вопросов^_^