2015-01-19 15 views
6

Tôi có một đối tượng mediaplayer khá chuẩn bắt đầu trong onCreate và vòng lặp cho nhạc nền trong ứng dụng của tôi. Các tập tin không phải là bất thường lớn, đó là một 6MB MP3. Từ onCreate:Android mediaplayer âm thanh ổn định/stutters chỉ trên các thiết bị mới hơn

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

này chỉ hoạt động tốt trên hầu hết các thiết bị thử nghiệm của tôi bao gồm cả điện thoại cũ, một Samsung Galaxy Tab 2 10" tablet, và thậm chí Nexus 4.

vấn đề Thật không may, tôi đang trải qua độc quyền với các thiết bị mới hơn, nơi tôi gặp phải sự cố âm thanh/nói lắp trên Nexus 5 và Nexus mới hơn 10. Những sự cố này chỉ xảy ra trên các thiết bị mới hơn, thường sau vài giây phát lại thích hợp, không phải ngay lập tức. 4.4.4 và vấn đề này chỉ xảy ra trên Nexus 5.

Vấn đề này dường như trầm trọng hơn vi Tôi tạm dừng đối tượng mediaplayer đó và chơi một đối tượng khác trong một khoảng thời gian ngắn (âm nhạc chiến đấu để chiến đấu ngắn trong trò chơi) nhưng sự cố xảy ra ngay cả khi không có biến chứng thêm này.

Tôi đã đọc rằng các phiên bản Android mới hơn đã gây ra sự cố với Mediaplayer, nhưng tôi chưa từng khắc phục hoặc đề xuất.

Có ai khác gặp phải sự cố này có thể đề xuất sửa chữa hoặc làm việc xung quanh không? Cảm ơn bạn đã dành thời gian!

+0

Bạn có nhận được giải pháp nào cho vấn đề này không? –

+0

Không, thật không may. – regomar

Trả lời

0

Tôi cũng nhận thấy điều này xảy ra trên thiết bị Android của mình.

Tôi nhận thấy rằng bạn không gọi Prepare() là một chức năng quan trọng trước khi phát âm thanh. EDIT - một cuộc gọi để chuẩn bị chỉ cần thiết khi tạo MediaPlayer bằng cách sử dụng mới, không phải với MediaPlayer.Create() được tích hợp sẵn.

Đối với vấn đề của bạn khi chuyển đổi giữa các nguồn, tôi khuyên bạn nên gọi hàm SeekTo() chính xác thời gian trong âm thanh mà bạn muốn phát và đợi vị trí đó với trình nghe SeekComplete. Trong nhận xét, tôi có một dòng nhỏ của mã hacky không đặt âm lượng trên mediaPlayer cho đến sau khi cuộc gọi bắt đầu. Điều này dường như làm giảm sự nói lắp, nhưng bạn có thể mất phần nhỏ đầu tiên của âm thanh.

Tôi đang sử dụng Xamarin Studio C#, nhưng ngay cả khi bạn đang sử dụng Java, cách tiếp cận tương tự này cũng sẽ hoạt động.

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

Gọi 'MediaPlayer.create()' sẽ tự động chuẩn bị âm thanh. Bạn chắc chắn không nên gọi nó một lần nữa. Từ tài liệu: "Phương pháp tiện lợi để tạo MediaPlayer cho một URI nhất định. Thành công, chuẩn bị() sẽ không được gọi và không được gọi lại". –

Các vấn đề liên quan