2015-01-19 6 views
6

onCreate에서 시작하고 내 앱에서 배경 음악을 재생하는 상당히 표준적인 미디어 플레이어 개체가 있습니다. 이 파일은 비정상적으로 크지 않고 6MB MP3입니다. 이 나이가 휴대폰, 삼성 갤럭시 탭 2 10 "태블릿, 심지어 넥서스 4최신 기기에서만 Android mediaplayer 오디오 장애/스터 터

불행하게도, 내가 경험하고 문제를 포함하여 내 테스트 장치의 대부분에 잘 작동

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

다음에서 onCreate에서 Nexus 5 및 최신 Nexus 10에서 오디오 글리치/더듬이가 발생하는 최신 기기에만 독점적으로 적용됩니다. 이러한 문제는 대개 적절한 재생이 완료된 후 곧바로 재생되지 않는 새로운 기기에서만 발생합니다 .Nexus 4 및 5 모두 Android 4.4.4이지만 문제는 Nexus 5에서만 발생합니다.

이 문제는 악화되는 것으로 보입니다. ko 그 미디어 플레이어 개체를 일시 중지하고 짧은 시간 동안 다른 것을 연주하십시오 (게임에서 짧은 싸움을위한 전투 음악). 그러나 글리치 링은 이러한 추가적인 복잡성 없이도 발생합니다.

Android의 최신 버전으로 인해 Mediaplayer에서 문제가 발생했지만 수정이나 제안이 없었 음을 읽었습니다.

수정이나 임시 해결책을 제안 할 수있는 사람이 누구나 있습니까? 시간 내 주셔서 감사합니다!

+0

이 문제에 대한 해결책은 있습니까? –

+0

아니요, 불행하게도. – regomar

답변

0

Android 기기에서도 이와 같은 현상이 나타났습니다.

오디오를 재생하기 전에 중요한 기능인 Prepare()를 호출하지 않습니다. EDIT - 내장 된 MediaPlayer.Create()가 아닌 new를 사용하여 MediaPlayer를 만들 때만 준비를 호출해야합니다.

소스 간을 전환 할 때 SeekTo()를 재생하여 SeekComplete 수신기로 해당 위치를 기다리는 오디오의 정확한 시간을 호출하는 것이 좋습니다. 의견에서, 나는 시작하기 전까지는 mediaPlayer에 볼륨을 설정하지 않는 해킹 코드가 있습니다. 이것은 말더듬을 줄이는 것처럼 보이지만, 오디오의 첫 부분을 잃을 수도 있습니다.

저는 Xamarin Studio C#을 사용하고 있습니다.하지만 자바를 사용하는 경우에도 이와 똑같은 접근 방식이 필요합니다.

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를을 만들 수있는 편리한 방법 성공은 이미 호출 된 것) (준비하고 다시 호출 할 수 없습니다." –