二进制音频流文件解码成数值文件遇到的问题

原创 2013年12月02日 19:19:36
这几天一直在弄音频文件的解码问题
纠结我好久
public class AudioSampleReader {
    
    private AudioInputStream audioInputStream;
    private AudioFormat format;
    
    public AudioSampleReader(File file)
            throws UnsupportedAudioFileException, IOException {
        audioInputStream = AudioSystem.getAudioInputStream(file);
        format = audioInputStream.getFormat();
    }


    public AudioFormat getFormat() {
        return format;
    }
    
//获取样本数目
    public long getSampleCount() {
        long total = (audioInputStream.getFrameLength() *
            format.getFrameSize() * 8) / format.getSampleSizeInBits();
      return total / format.getChannels();   
        
    }
 //获取十进制样本值   
    public void getInterleavedSamples(long begin, long end,
            double[] samples) throws IOException,
                IllegalArgumentException {
        long nbSamples = end - begin;
        long nbBytes = nbSamples * (format.getSampleSizeInBits() / 8) *format.getChannels();
        if (nbBytes > Integer.MAX_VALUE)
            throw new IllegalArgumentException("too many samples");
        byte[] inBuffer = new byte[(int)nbBytes];
        // read bytes from audio file
        audioInputStream.read(inBuffer, 0, inBuffer.length);
        // decode bytes into samples. Supported encodings are:
        // PCM-SIGNED, PCM-UNSIGNED, A-LAW, U-LAW
        double ratio = Math.pow(2., format.getSampleSizeInBits() - 1);  
        decodeBytes(inBuffer, samples,ratio);
    }
    //获取特定声道的样本值
    public void getChannelSamples(int channel,
            double[] interleavedSamples, double[] channelSamples) {
        int nbChannels = format.getChannels();
        for (int i = 0; i < channelSamples.length; i++) {
            channelSamples[i] = interleavedSamples[nbChannels*i + channel];
        }
    }
    
//分别获取左右声道
    public void getStereoSamples(double[] leftSamples, double[] rightSamples)
            throws IOException {
        long sampleCount = getSampleCount();
        double[] interleavedSamples = new double[(int)sampleCount*2];
        getInterleavedSamples(0, sampleCount, interleavedSamples);


        for (int i = 0; i < leftSamples.length; i++) {
            leftSamples[i] = interleavedSamples[2*i];
            rightSamples[i] = interleavedSamples[2*i+1];
        }        
    }


//解码函数
private void decodeBytes(byte[] audioBytes, double[] audioSamples,double ratio) {
        int sampleSizeInBytes = format.getSampleSizeInBits() / 8;
        int[] sampleBytes = new int[sampleSizeInBytes];
        int k = 0; // index in audioBytes
        for (int i = 0; i < audioSamples.length; i++) {
            // collect sample byte in big-endian order
            if (format.isBigEndian()) {
                // bytes start with MSB
                for (int j = 0; j < sampleSizeInBytes; j++) {
                    sampleBytes[j] = audioBytes[k++];
                   
                }
            } else {
                // bytes start with LSB
                for (int j = sampleSizeInBytes - 1; j >= 0; j--) {
                    sampleBytes[j] = audioBytes[k++];
                    if (sampleBytes[j] != 0)
                        j = j + 0;
                }
            }
            int ival = 0;
            
            for (int j = 0; j < sampleSizeInBytes; j++) {
                ival += sampleBytes[j];
if (j < sampleSizeInBytes - 1) ival <<= 8;  //左移8位相当于乘以2的8次方(一个字节占8位),高8位*2^8+低8位既为十进制解码
            }
           
            // decode value
            //但是结果这样子算结果是不对的!!!!
//与matlabwavread函数结果不一样!!!!
            
           double val = ((double) ival+256) / ratio; // 然后,我发现给ival加上256,结果就与matlab一致了,这是为什么,为什么!!!!!!!!
            audioSamples[i] = val;
        }
    }
    
}


给ival加上256,结果就与matlab一致了,这是为什么,为什么!!!!!!!!
给ival加上256,结果就与matlab一致了,这是为什么,为什么!!!!!!!!
给ival加上256,结果就与matlab一致了,这是为什么,为什么!!!!!!!!
给ival加上256,结果就与matlab一致了,这是为什么,为什么!!!!!!!!
给ival加上256,结果就与matlab一致了,这是为什么,为什么!!!!!!!!




求高手解答!!!!!
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

DirectSound 播放自定义采集的数据

#pragma once #include #include #include #include #include #include #include #inclu...

audio标签播放音频二进制文件

网页上放一个audio元素 audio id="aud">audio> 将这个元素的src属性绑定数据流 websocket.onmessage = funct...
  • dx825
  • dx825
  • 2016-11-19 13:27
  • 1003

HTML5中使用audio元素播放音频

HTML5中的audio元素播放音频简介

科大讯飞语音识别(获取音频流文件中文字)

使用讯飞sdk获取视频文件中的音频文字

Android多媒体学习七:访问网络上的Audio对应的M3U文件,实现网络音频流的播放

http://blog.csdn.net/chenjie19891104/article/details/6331442 Android中提供了对网络上流媒体的支持,我们可以使用MediaPla...

Android多媒体学习六:访问网络上的Audio对应的M3U文件,实现网络音频流的播放

Android中提供了对网络上流媒体的支持,我们可以使用MediaPlayer类来播放一个网络上的音频文件。 但是网络上的站点并不建议我们直接访问流,我们需要获取他提供的M3U文件,根据M3U文件来...
  • swdrt
  • swdrt
  • 2013-05-08 21:33
  • 1042

Android多媒体--访问网络上的Audio对应的M3U文件,实现网络音频流的播放

From:http://blog.csdn.net/swdrt/article/details/8902596

Android多媒体学习七:访问网络上的Audio对应的M3U文件,实现网络音频流的播放

Android中提供了对网络上流媒体的支持,我们可以使用MediaPlayer类来播放一个网络上的音频文件。但是网络上的站点并不建议我们直接访问流,我们需要获取他提供的M3U文件,根据M3U文件来实现...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)