PCM Wave文件 - 立体声到单声道

fre*_*ley 9 java audio pcm vorbis

我有一个立体声音频文件.将它转换为单声道只是跳过每隔一个字节(在标题之后)的情况?它采用16位有符号PCM格式编码.我javax.sound.sampled有空.

这是我试过的代码不起作用的代码:

WaveFileWriter wfw = new WaveFileWriter();
AudioFormat format = new AudioFormat(Encoding.PCM_SIGNED, 44100, 16, 2, 2, 44100, false);
AudioFormat monoFormat = new AudioFormat(Encoding.PCM_SIGNED, 44100, 16, 1, 2, 44100, false);

byte[] audioData = dataout.toByteArray();
int length = audioData.length;
ByteArrayInputStream bais = new ByteArrayInputStream(audioData);

AudioInputStream stereoStream = new AudioInputStream(bais,format,length);
AudioInputStream monoStream = new AudioInputStream(stereoStream,format,length/2);

wfw.write(monoStream, Type.WAVE, new File(Environment.
                 getExternalStorageDirectory().getAbsolutePath()+"/stegDroid/un-ogged.wav"));
Run Code Online (Sandbox Code Playgroud)

.ogg使用Jorbis 读取文件后将此代码转换为PCM数据.唯一的问题是结果是立体声,我需要它是单声道,所以如果有另一种解决方案,我很高兴听到它!

Bro*_*ass 9

我有一个立体声音频文件.将它转换为单声道只是跳过每隔一个字节(在标题之后)的情况?

几乎 - 你想跳过所有其他样本,而不是字节.在您的情况下,看起来每个样本的大小为16位= 2个字节.所以你想要2个字节,跳过2个字节,取2个字节,依此类推.

AudioInputStream monoStream = new AudioInputStream(stereoStream,format,length/2);

wfw.write(monoStream, Type.WAVE, new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/stegDroid/un-ogged.wav"));
Run Code Online (Sandbox Code Playgroud)

这看起来就像你只写出文件的前半部分而不是写出每个其他样本.此外,您必须修复WAV标头,以指定单个通道(请参阅您的monoFormat).

  • 如果你跳过其他所有样本,那么你只能获得一个立体声(左/右)声道.您可能希望将左/右组合成单个单声道.一种天真的方式是简单地将样本加在一起并除以2(平均).小心使用适当的类型以避免溢出.对于16位采样,请确保使用32位int进行平均.值得注意的是,还有其他方法可以混合样本. (10认同)