我想寫一個Java程序來分割一個wav文件到頻道。輸入將是一個wav文件,並且輸出將是頻道數量與wav文件一樣多。我可以用Java讀取wav文件,但是,我怎樣才能將它分解成多個通道?如何在Java中將Wav文件分割爲多個通道?
回答
如果您有16位深度,那麼意味着每個採樣需要2個字節。這意味着左聲道數據將以字節{0,1},{4,5} ...爲依據。
在我的項目中,我用兩個內置麥克風的AudioRecord錄製立體聲。
private int audioSource = MediaRecorder.AudioSource.MIC;
private static int sampleRateInHz = 44100;
private static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
readsize = audioRecord.read(audiodata, 0, bufferSizeInBytes);
for(int i = 0; i < readsize/2; i = i + 2)
{
leftChannelAudioData[i] = audiodata[2*i];
leftChannelAudioData[i+1] = audiodata[2*i+1];
rightChannelAudioData[i] = audiodata[2*i+2];
rightChannelAudioData[i+1] = audiodata[2*i+3];
}
然後我從立體聲中得到了兩個聲道。
希望這會有所幫助!
Wave標題包含每個樣本的樣本量(以位爲單位)和波形文件中編碼的通道數的字段。
通過掌握這些信息,您可以拆分通道:波形文件中的採樣數據包含每個通道交錯的採樣。
I.e.如果您有兩個通道(A,B),則您有sA1,sB1,sA2,SB2,sA3,sB3 - 首先是A的樣本,然後是B的樣本,然後是A的樣本,依此類推。這意味着如果您有樣本大小,即16位,則您從文件中讀取屬於通道A的2個字節,然後讀取屬於通道B的2個字節,依此類推。
而做u如何讀取來自樣品2個字節?你能寫一個例子嗎? – Poko 2011-04-25 08:44:11
請參閱this sample並將每個通道寫入一個文件。
我正在創建一個簡單的應用程序來幫助自己,根據您的示例,我設法將多個wav文件合併爲一個。但我仍然不知道如何通過通道將該文件分割成多個文件(一個通道 - 一個文件)。 – JNM 2013-03-13 13:08:14
下面是一個完整的例子:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
public class ChannelSplitter {
public static void main(String[] args) throws Exception {
String filename = "test.wav";
File sourceFile = new File(filename);
File leftTargetFile = new File("left_"+filename);
File rightTargetFile = new File("right_"+filename);
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(sourceFile);
AudioFileFormat.Type targetFileType = fileFormat.getType();
AudioFormat audioFormat = fileFormat.getFormat();
AudioInputStream inputAIS = AudioSystem.getAudioInputStream(sourceFile);
ByteArrayOutputStream leftbaos = new ByteArrayOutputStream();
ByteArrayOutputStream rightbaos = new ByteArrayOutputStream();
byte[] bytes = new byte[(audioFormat.getSampleSizeInBits()/8)*2];
while (true) {
int readsize = inputAIS.read(bytes);
if(readsize==-1){
break;
}
rightbaos.write(bytes,0,bytes.length/2);
leftbaos.write(bytes,bytes.length/2,bytes.length/2);
}
byte[] leftData = leftbaos.toByteArray();
byte[] rightData = rightbaos.toByteArray();
AudioFormat outFormat = new AudioFormat(audioFormat.getEncoding(),audioFormat.getSampleRate(),audioFormat.getSampleSizeInBits(),1,audioFormat.getFrameSize()/2, audioFormat.getFrameRate(),audioFormat.isBigEndian());
ByteArrayInputStream leftbais = new ByteArrayInputStream(leftData);
AudioInputStream leftoutputAIS = new AudioInputStream(leftbais, outFormat, leftData.length/outFormat.getFrameSize());
AudioSystem.write(leftoutputAIS, targetFileType, leftTargetFile);
ByteArrayInputStream rightbais = new ByteArrayInputStream(rightData);
AudioInputStream rightoutputAIS = new AudioInputStream(rightbais, outFormat, rightData.length/outFormat.getFrameSize());
AudioSystem.write(rightoutputAIS, targetFileType, rightTargetFile);
}
}
- 1. 如何使用Java將wav文件分割爲更小的塊?
- 2. 如何將文本文件分割爲多個文本文件
- 3. 將wav文件分割成片段
- 4. 分割音頻文件(WAV)
- 5. 如何將大文件分割爲多個文件?
- 6. 如何使用python將mp3文件分割爲多個部分
- 7. 如何將文件輸入分割爲Java中的部分
- 8. Java - Wav音頻分割
- 9. 如何根據java中的字符長度將HTML文件分割爲多個
- 10. React Native:如何將一個文件分割成多個文件
- 11. 如何將多個文件分割成一個gb文件夾?
- 12. 如何通過DIV將頁面分割爲多個部分?
- 13. 如何使用Java將wav文件劃分爲1秒?
- 14. 如何將Scala腳本分割爲多個文件
- 15. 如何將此csv文件分割爲多個內容?
- 16. 將wav文件轉換爲單聲道
- 17. cmake文件結構,如何將CMakeLists.txt分割成多個文件?
- 18. 如何將文本文件分割爲多個其他文本文件?
- 19. PHP腳本將大文本文件分割爲多個文件
- 20. 如何將文本文件逐位分割爲兩個文件
- 21. WAV文件分割器工具
- 22. 如何分割在幾個文件中
- 23. 將tmux.conf分割成多個文件?
- 24. 將wav文件轉換爲wav文件
- 25. 如何在Java中播放.wav文件?
- 26. Python將大文件分割爲多個文件
- 27. 將平面文件行分割爲多個平面文件SSIS
- 28. Python OpcenCV將錄製文件分割爲多個文件
- 29. 如何在GO lang中將大型csv文件分割成多個文件?
- 30. 如何使用java將FLAC文件轉換爲WAV文件?
問題是針對Java而不是Android。問題標籤也沒有指出任何Android – 2017-04-20 13:15:32