Преобразование моно в стереозвук
Я пытаюсь преобразовать 16-битный моно звук в стерео. Звук хранится в виде байтового массива, поэтому, насколько я понимаю, я дублирую два байта за раз.
Я делаю это правильно? Код, который я произвел, меняет частоту.
РЕДАКТИРОВАТЬ:
Я успешно генерирую моно тон и сохраняю его в byte [] generatedSnd
Воспроизведение монофонического звука (работает):
AudioTrack audioTrack = null; // Get audio track
try {
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, (int)numSamples*2,
AudioTrack.MODE_STATIC);
audioTrack.setStereoVolume(0f, 1f);
audioTrack.write(generatedSnd, 0, generatedSnd.length); // Load the track
audioTrack.play(); // Play the track
}
catch (Exception e){ }
Преобразование в стереозвук:
int monoByteArrayLength = generatedSnd.length;
byte [] stereoGeneratedSnd = new byte[monoByteArrayLength * 2];
stereoGeneratedSnd[0] = generatedSnd[0];
stereoGeneratedSnd[2] = generatedSnd[0];
for (int x=1; x<monoByteArrayLength; x+=2) {
stereoGeneratedSnd[x*2-1] = generatedSnd[x];
stereoGeneratedSnd[x*2+1] = generatedSnd[x];
if (x+1 < monoByteArrayLength) {
stereoGeneratedSnd[x*2] = generatedSnd[x+1];
stereoGeneratedSnd[x*2+2] = generatedSnd[x+1];
}
}
AudioTrack audioTrack = null; // Get audio track
try {
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate, AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT, (int)numSamples*2,
AudioTrack.MODE_STATIC);
audioTrack.setStereoVolume(0f, 1f);
audioTrack.write(stereoGeneratedSnd, 0, stereoGeneratedSnd.length); // Load the track
audioTrack.play(); // Play the track
}
catch (Exception e){ }
Я пытаюсь воспроизвести звук только с одного канала.
2 ответа
Выход из вашего алгоритма удвоения 0, 1, 2, 1, 2, 3, 4, 3, 4, 5, 0, 5
,
Более простой (и правильный) способ удвоения был бы:
for (int i = 0; i < monoByteArrayLength; i += 2) {
stereoGeneratedSnd[i*2+0] = generatedSnd[i];
stereoGeneratedSnd[i*2+1] = generatedSnd[i+1];
stereoGeneratedSnd[i*2+2] = generatedSnd[i];
stereoGeneratedSnd[i*2+3] = generatedSnd[i+1];
}
Выход: 0, 1, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5
Это намеренно, что вы дублируете два байта за раз? Стерео режим в 16-битном формате PCM Wave принимает:
DATA[ ] : [1st byte from Chanel 1], [1st byte from Chanel 2], [2nd byte from Chanel 1], [2nd byte from Chanel 2]...
Так что если вы хотите конвертировать моно в стерео, ваш массив должен быть:
Mono : 0, 1, 2, 3 ...
Stereo : 0, 0, 1, 1, 2, 2, 3, 3 ...
и если вы хотите только один канал
Stereo : 0, 0, 1, 0, 2, 0, 3, 0 ...