Tôi đang sử dụng AudioTrack
để phát một chuỗi sóng sin, nhưng khi tôi chạy trên HTC M9, nó chỉ phát một phần trong các mẫu và thời gian phát ngẫu nhiên. e. g. Tôi có 20 tấn để chơi, nhưng nó chỉ chơi như 2 đến 17,5 tấn của họ. Và có nó thậm chí sẽ dừng lại ở giữa một giai điệu.Android AudioTrack không phát tất cả các mẫu
Đây là mã của tôi, từ câu trả lời khác:
ArrayList<double[]> samples = new ArrayList<>();
int numSamples = 0;
for (final ToneSegment seg : sequence) {
int num = seg.getDuration() * sampleRate/1000;
double[] sample = new double[num];
for (int i = 0; i < num; ++i) {
sample[i] = Math.sin(2 * Math.PI * i * seg.getPitch()/sampleRate);
}
samples.add(sample);
numSamples += num;
}
byte generatedSnd[] = new byte[2 * numSamples];
int idx = 0;
for (double[] sample : samples) {
for (final double dVal : sample) {
final short val = (short) ((dVal * 32767));
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
}
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
AudioTrack.MODE_STATIC);
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
Có ai có bất kỳ ý tưởng? Cảm ơn!
Tôi đã thử MODE_STREAM, nhưng cũng vậy. Mẫu của tôi chỉ phát trong 3 đến 7 giây. –
Họ chơi trong một khoảng thời gian ngẫu nhiên? Bạn đã thử các mẫu âm thanh ngắn hơn hay các mẫu âm thanh khác chưa? Và bạn có nhân số byte quá không? – jobbert
Có, tôi đã thử các mẫu khác. Chúng không phải là thời gian ngẫu nhiên. Điều gì là nhân số lượng byte? –