12

Tôi đang cố gắng lặp lại các tệp ogg ngắn (20kb), không có khoảng trống với lớp SoundPool và không thể nhận được kết quả nhất quán trong khi thử nghiệm trên phần cứng. Nó luôn luôn phát lại hoàn hảo bằng cách sử dụng trình mô phỏng nhưng khi tôi thử nghiệm trên Nexus 1 hoặc trên Galaxy Galaxy Tab 10.1 có các cửa sổ bật lên hoặc nhấp chuột có thể nghe được ở mọi điểm lặp. Điều rất lạ là trong khi phù hợp khi ứng dụng đã bắt đầu, các nhấp chuột hơi khác nhau mỗi lần tôi khởi động lại ứng dụng và trong những dịp hiếm hoi (thường xuyên hơn trên máy tính bảng) vòng lặp phát chính xác.Looping liền mạch với SoundPool trên Android?

Kết quả không tốt hơn khi sử dụng MediaPlayer. Có bất hợp lý để mong đợi phát lại không có vòng lặp của các vòng âm thanh trên Android không? Chắc chắn ai đó có chức năng tương tự làm việc đúng cách? Nếu vậy tôi rất thích xem một ví dụ về cách nó hoạt động.

Cảm ơn!

+0

Tôi đang ở trong cùng một chiếc thuyền, các tệp WAV hoạt động kém như nhau: vòng lặp hoàn hảo không có khoảng cách dường như không thể. Nếu bạn cố gắng để fadein/ra 10 mẫu đầu tiên và cuối cùng của bài hát, sau đó bạn sẽ nghe thấy rất rõ ràng các phần nghìn giây tạm dừng dài, không có nhấp chuột, nhưng phai là rất âm thanh .. o_O – Manuel

+3

Khó khăn đó là rất nhiều rắc rối cho những gì bạn muốn, bạn luôn có thể sử dụng AudioTrack, sử dụng luồng bit liên tục. – user717572

+0

Nó sẽ âm thanh ngu ngốc nhưng nó (rõ ràng) không hợp lý để mong đợi phát lại âm thanh không khe hở, liền mạch. – SARose

Trả lời

4

tôi đã sử dụng một hack mà hoạt động tốt cho các tập tin duy nhất:

HACK_loopTimer = new Timer(); 
HACK_loopTask = new TimerTask() {    
    @Override public void run() { 
     mMediaPlayer.seekTo(0); 
    } 
}; 
long waitingTime = mMediaPlayer.getDuration()-mHackLoopingPreview; 
HACK_loopTimer.schedule(HACK_loopTask, waitingTime, waitingTime); 

Chỉ cần thiết lập mHackLoopingPreview đến một số lượng hợp lý; Tôi đang sử dụng 100ms và nó hoạt động tốt. Tôi phải đồng ý rằng đây là giải pháp ít hơn lý tưởng và xấu xí, nhưng ít nhất nó thực hiện công việc của mình.

+1

nó hoạt động, nhưng không phải khi ứng dụng ở chế độ nền có một khoảng cách nhỏ trong vòng lặp – farrukh

+1

Bạn có thể mở rộng ví dụ này thêm một chút không? Ví dụ: bạn gọi start() hoặc chuẩn bị() ở đâu? –

+0

Điều này không hiệu quả với tôi. Có lẽ bởi vì tôi đã không thực hiện nó ở đúng nơi như @ Primož'c0dehunter'Kralj ngụ ý. – SARose

0

Điều này nghe có vẻ giống như cảnh sát nhưng có 2 điều bạn có thể thử, lần đầu tiên làm việc cho tôi.

  1. làm cho bạn tập tin âm thanh ogg định dạng ở tỷ lệ mẫu 48kHz và 48Kbit/s (Điều này làm việc cho tôi)

  2. Bạn có thể tạo 2 đối tượng MediaPlayer và (giống như câu trả lời của @Beowulf Bjornson 's) khoảng < = 100ms khởi động MediaPlayer # 2 ngay trước khi MediaPlayer # 1 kết thúc và thay thế giữa toàn bộ thời gian.

Hy vọng mọi người đến đây sẽ thử những gì tôi nói vì tôi đã lãng phí khoảng 3 ngày cố gắng tìm hiểu điều này chỉ ngạc nhiên rằng không có cách nào để làm điều này một cách hoàn hảo .

1

tôi tìm thấy giải pháp khác:

afd = assetManager.openFd(nameSound); 

player.setDataSource(afd.getFileDescriptor(), 
        afd.getStartOffset(), afd.getLength() - 1000); 
afd.close(); 
player.prepare(); 
player.setLooping(true); 
player.start(); 

Bạn chỉ cần xác định thời gian 1000 (1ms) ít thay vào đó tổng thời gian. Y eso es todo, problema resuelto !!!!

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