Tôi có tính năng tôi muốn chuyển sang sử dụng Android AudioTrack
thay vì MediaPlayer
do một số lỗi nổi tiếng với MediaPlayer
, chẳng hạn như khoảng cách nhỏ xuất hiện giữa các tuyến đường vòng lặp.Phát lặp âm thanh bằng AudioTrack
Tôi đã được đề xuất sử dụng AudioTrack
nhưng chưa tìm thấy nhiều ví dụ về việc sử dụng. Tôi đã tìm thấy một câu hỏi về SO về AudioTrack
và sử dụng một số đoạn mã đó để hack cùng điều gì đó:
public class TestActivity extends Activity implements Runnable {
Button playButton;
byte[] byteData = null;
int bufSize;
AudioTrack myAT = null;
Thread playThread = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
playButton = (Button) findViewById(R.id.testButton);
InputStream inputStream = getResources().openRawResource(R.raw.whitenoise_wav);
try {
byteData = new byte[ inputStream.available()];
} catch (IOException e) {
e.printStackTrace();
}
try {
inputStream.read(byteData);
inputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
initialize();
playButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
playThread.start();
}
});
}
void initialize() {
bufSize = android.media.AudioTrack.getMinBufferSize(44100,
AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
myAT = new AudioTrack(AudioManager.STREAM_MUSIC,
44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT, bufSize,
AudioTrack.MODE_STREAM);
myAT.setVolume(.2f);
playThread = new Thread(this);
}
public void run() {
if (myAT != null) {
myAT.play();
myAT.setLoopPoints(0, byteData.length, 6);
myAT.write(byteData, 0, byteData.length);
}
}
}
Vì vậy, điều này dường như để chơi toàn bộ track âm thanh (~ 1: 00 phút) rồi dừng lại. Bây giờ mục tiêu cuối cùng ở đây là hai có 2 track âm thanh riêng biệt chơi và looping cùng một lúc. Tôi hiện đang có các bản âm thanh trong thư mục /res/raw/
, nhưng tôi có thể chuyển chúng vào thư mục assets
đơn giản nếu điều đó tốt hơn. Việc triển khai hiện tại của tôi là AudioTrack
có đúng không? Nếu vậy, làm thế nào tôi sẽ làm cho nó lặp lại?
Tóm tắt: cách bạn có thể phát âm thanh lặp mà không có khoảng cách sử dụng AudioTrack
?
Đề xuất các cách thay thế để nhận âm thanh lặp, chẳng hạn như thư viện của bên thứ ba, được hoan nghênh.
Bạn có muốn phát cả hai bản nhạc cùng lúc và cũng lặp lại âm thanh đó khi hoàn thành đúng không? –
Đúng vậy. – Orbit
Kiểm tra điều này: http://developer.android.com/reference/android/media/SoundPool.html –