2011-04-23 49 views
1

我想寫一個Java程序來分割一個wav文件到頻道。輸入將是一個wav文件,並且輸出將是頻道數量與wav文件一樣多。我可以用Java讀取wav文件,但是,我怎樣才能將它分解成多個通道?如何在Java中將Wav文件分割爲多個通道?

回答

1

如果您有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]; 
} 

然後我從立體聲中得到了兩個聲道。

希望這會有所幫助!

+0

問題是針對Java而不是Android。問題標籤也沒有指出任何Android – 2017-04-20 13:15:32

4

Wave標題包含每個樣本的樣本量(以位爲單位)和波形文件中編碼的通道數的字段。

通過掌握這些信息,您可以拆分通道:波形文件中的採樣數據包含每個通道交錯的採樣。

I.e.如果您有兩個通道(A,B),則您有sA1,sB1,sA2,SB2,sA3,sB3 - 首先是A的樣本,然後是B的樣本,然後是A的樣本,依此類推。這意味着如果您有樣本大小,即16位,則您從文件中讀取屬於通道A的2個字節,然後讀取屬於通道B的2個字節,依此類推。

+0

而做u如何讀取來自樣品2個字節?你能寫一個例子嗎? – Poko 2011-04-25 08:44:11

1

請參閱this sample並將每個通道寫入一個文件。

+0

我正在創建一個簡單的應用程序來幫助自己,根據您的示例,我設法將多個wav文件合併爲一個。但我仍然不知道如何通過通道將該文件分割成多個文件(一個通道 - 一個文件)。 – JNM 2013-03-13 13:08:14

0

下面是一個完整的例子:

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); 
    } 
} 
相關問題