简体   繁体   中英

How play .WAV backwards?

I have .WAV file. I need play it backwards. How I can do this? I read data with InputStream from file, then convert it in byte array. Reverse this array, and then write this array in another file? Where is wrong logic?

      public void copyWaveFile(String inFilename,String outFilename){
                    FileInputStream in = null;
                    FileOutputStream out = null;
                    long totalAudioLen = 0;`enter code here`
                    long totalDataLen = totalAudioLen + 36;
                    long longSampleRate = frequency;
                    int channels = 1;
                    long byteRate = RECORDER_BPP * frequency * channels/8;
                    byte[] data = new byte[recBufSize];

                    try {
                        in = new FileInputStream(inFilename);
                        out = new FileOutputStream(outFilename);
                        totalAudioLen = in.getChannel().size();
                        totalDataLen = totalAudioLen + 36;

                       // Why this is don't work?
                        data = convertStreamToByteArray(in,recBufSize);
                        byte[] reverseData = reverseByteArray(data);
                        out.write(reverseData);

                        WriteWaveFileHeader(out, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate);

                        in.close();
                        out.close();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

         // convert InputStream to byte array   
         public static byte[] convertStreamToByteArray(InputStream is,int size) {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[size];
                byte[] result = null;
                int b;
                try {
                    while ((b = is.read(buffer, 0, buffer.length)) != -1) {
                        baos.write(buffer, 0, b);
                    }
                    result = baos.toByteArray();

                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        baos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return result;
            }

            // reverse byte array
            private byte[] reverseByteArray(byte[] arr) {
                int i = 0, j = arr.length-1;
                byte tmp;
                while(i<j) {
                    tmp    = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                    i++;
                    j--;
                }
                return arr;
            }

        // header for wav file`enter code here
        private void WriteWaveFileHeader(
                FileOutputStream out, long totalAudioLen,
                long totalDataLen, long longSampleRate, int channels,
                long byteRate) throws IOException {

            byte[] header = new byte[44];

            header[0] = 'R';  // RIFF/WAVE header
            header[1] = 'I';
            header[2] = 'F';
            header[3] = 'F';
            header[4] = (byte) (totalDataLen & 0xff);
            header[5] = (byte) ((totalDataLen >> 8) & 0xff);
            header[6] = (byte) ((totalDataLen >> 16) & 0xff);
            header[7] = (byte) ((totalDataLen >> 24) & 0xff);
            header[8] = 'W';
            header[9] = 'A';
            header[10] = 'V';
            header[11] = 'E';
            header[12] = 'f';  // 'fmt ' chunk
            header[13] = 'm';
            header[14] = 't';
            header[15] = ' ';
            header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
            header[17] = 0;
            header[18] = 0;
            header[19] = 0;
            header[20] = 1;  // format = 1
            header[21] = 0;`enter code here`
            header[22] = (byte) channels;
            header[23] = 0;
            header[24] = (byte) (longSampleRate & 0xff);
            header[25] = (byte) ((longSampleRate >> 8) & 0xff);
            header[26] = (byte) ((longSampleRate >> 16) & 0xff);
            header[27] = (byte) ((longSampleRate >> 24) & 0xff);
            header[28] = (byte) (byteRate & 0xff);
            header[29] = (byte) ((byteRate >> 8) & 0xff);
            header[30] = (byte) ((byteRate >> 16) & 0xff);
            header[31] = (byte) ((byteRate >> 24) & 0xff);
            header[32] = (byte) (1 * 16 / 8);  // block align
            header[33] = 0;
            header[34] = RECORDER_BPP;  // bits per sample
            header[35] = 0;
            header[36] = 'd';
            header[37] = 'a';
            header[38] = 't';
            header[39] = 'a';
            header[40] = (byte) (totalAudioLen & 0xff);
            header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
            header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
            header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
            out.write(header, 0, 44);
        }

It depends on the bitrate. But in general you can't just reorder the bytes. The wave file has it's logical format which must be kept in order to play the file again. For a PCM encoded wave file with 16 bit for example I'd try to reverse 16 bit chunks. So the last 16 bit chunk goes first without reordering the bytes. Thinking about it, I doubt this can work. There has to be a kind of header which must be preserved or rewritten at the beginning and maybe some bytes signaling the end of the audio data.

This should help, but it's not as trivial as you thought. RIFF WAVE

Maybe there's a Java library for that?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM