我試圖將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){ }
我想要做的是發揮出來的聲音y單通道
請添加更多上下文。這是什麼格式?你用什麼庫來播放文件?什麼語言?還有一個關於常識的問題:**播放流的邏輯應該如何知道這是單聲道文件,每兩個採樣相同,還是假立體聲?它不能只是「猜測」...應該有一些元數據,描述流,不是嗎?** – ppeterka