Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中将Wav文件拆分为通道?_Java_Audio_Wav - Fatal编程技术网

如何在java中将Wav文件拆分为通道?

如何在java中将Wav文件拆分为通道?,java,audio,wav,Java,Audio,Wav,我想写一个Java程序来将wav文件分割成通道。输入将是一个wav文件,输出将是与通道数量相同的wav文件。我可以用Java读取wav文件,但如何将其拆分为通道?Wave头包含每个样本的样本大小(以位为单位)字段以及Wave文件中编码的通道数 有了这些信息,您可以分割通道:波形文件中的样本数据包含每个交叉通道的样本 也就是说,如果有两个通道(A、B),则有sA1、sB1、sA2、SB2、sA3、sB3-首先是A的样品,然后是B的样品,然后是A的样品,依此类推。这意味着,如果您有样本大小,即16位

我想写一个Java程序来将wav文件分割成通道。输入将是一个wav文件,输出将是与通道数量相同的wav文件。我可以用Java读取wav文件,但如何将其拆分为通道?

Wave头包含每个样本的样本大小(以位为单位)字段以及Wave文件中编码的通道数

有了这些信息,您可以分割通道:波形文件中的样本数据包含每个交叉通道的样本


也就是说,如果有两个通道(A、B),则有sA1、sB1、sA2、SB2、sA3、sB3-首先是A的样品,然后是B的样品,然后是A的样品,依此类推。这意味着,如果您有样本大小,即16位,则从文件中读取属于通道A的2个字节,然后读取属于通道B的2个字节,依此类推。

波形头包括每个样本的样本大小(以位为单位)字段以及波形文件中编码的通道数

有了这些信息,您可以分割通道:波形文件中的样本数据包含每个交叉通道的样本


也就是说,如果有两个通道(A、B),则有sA1、sB1、sA2、SB2、sA3、sB3-首先是A的样品,然后是B的样品,然后是A的样品,依此类推。这意味着,如果有样本大小,即16位,则从文件中读取属于通道A的2个字节,然后读取属于通道B的2个字节,依此类推。

如果有16位深度,则意味着每个样本将占用2个字节。这意味着左通道数据将以字节{0,1}、{4,5}为单位。。。等等

在我的项目中,我使用两个内置麦克风录制立体声录音

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];
}
private int audioSource=MediaRecorder.audioSource.MIC;
专用静态int SampleratInHZ=44100;
私有静态int-channelConfig=AudioFormat.CHANNEL\u在立体声中;
专用静态int audioFormat=audioFormat.ENCODING_PCM_16位;
readsize=audioRecord.read(audiodata,0,bufferSizeInBytes);
对于(int i=0;i
然后我从立体声中得到了两个频道


希望这会有帮助

如果深度为16位,则意味着每个样本将占用2个字节。这意味着左通道数据将以字节{0,1}、{4,5}为单位。。。等等

在我的项目中,我使用两个内置麦克风录制立体声录音

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];
}
private int audioSource=MediaRecorder.audioSource.MIC;
专用静态int SampleratInHZ=44100;
私有静态int-channelConfig=AudioFormat.CHANNEL\u在立体声中;
专用静态int audioFormat=audioFormat.ENCODING_PCM_16位;
readsize=audioRecord.read(audiodata,0,bufferSizeInBytes);
对于(int i=0;i
然后我从立体声中得到了两个频道


希望这会有帮助

以下是一个完整的示例:

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);
    }
}

下面是一个完整的示例:

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);
    }
}

找到了一个非常简单的方法,但不确定计算效率如何

public void splitByteArray (byte [] fileContent, byte [] fileContentLeft, byte [] fileContentRight) {
    for (int i = 0; i < fileContent.length; i += 4) {
        fileContentLeft[i] = fileContent[i];
        fileContentLeft[i + 1] = fileContent[i + 1];
        fileContentRight[i + 2] = fileContent[i + 2];
        fileContentRight[i + 3] = fileContent[i + 3];
    }
}
public void splitByteArray(字节[]fileContent,字节[]fileContentLeft,字节[]fileContentRight){
对于(int i=0;i

这适用于16位wav PCM,其中立体声阵列中的0&1索引为左声道,2&3索引为右声道(均为8位单声道)。

找到了一种非常简单的方法,但不确定其计算效率如何

public void splitByteArray (byte [] fileContent, byte [] fileContentLeft, byte [] fileContentRight) {
    for (int i = 0; i < fileContent.length; i += 4) {
        fileContentLeft[i] = fileContent[i];
        fileContentLeft[i + 1] = fileContent[i + 1];
        fileContentRight[i + 2] = fileContent[i + 2];
        fileContentRight[i + 3] = fileContent[i + 3];
    }
}
public void splitByteArray(字节[]fileContent,字节[]fileContentLeft,字节[]fileContentRight){
对于(int i=0;i

这适用于16位wav PCM,其中立体声阵列中的0&1索引为左声道,2&3索引为右声道(均为8位单声道)。

您如何从样本中读取2个字节?你能为它写一个例子吗?你如何从样本中读取2个字节?你们能为它写一个例子吗?问题是针对Java,而不是Android。问题标签除了输入法之外也不表示任何东西,答案是纯Java。只需将从AudioInputStream读取字节数组替换为第一行,问题是Java,而不是Android。问题标签除了输入法之外也不表示任何东西,答案是纯Java。将从AudioInputStream读取字节数组替换为第一行。我看不出这个答案在原始立体声行的两个通道之间有任何区别。我看不出这个答案在原始立体声行的两个通道之间有任何区别。两个结果数组保留16位编码状态,尽管如此,两个结果数组仍保持16位编码状态。