5

我正在做我最后一年的 JAVA 项目

1)在图像中隐藏文本

2)图像中的图像

3)音频文件中的文本(WAVE)

我已成功完成 1) 和 2) 并已附上源代码(如果有人可能需要)。我在第三个问题中遇到了麻烦,即在音频文件中隐藏数据。我从波形文件中创建了一个音频输入流并将其数据读入一个字节数组,但很多事情都不清楚,在阅读时我猜第一个 44 个字节是标题字节?(因为文件是 WAVE 格式)或标题根本不被复制。问题是....在再次解码时,我必须从字节数组中新创建的音频文件中读取数据。而且我无法找到隐藏数据的字节。

谁能告诉我当我们从 audioinputstream 将数据读入字节数组时究竟会发生什么,我的意思是实际读入字节数组的内容是什么?

File fileIn = new File("C:\\Users\\Rahul\\Desktop\\pro\\Don't Stay.wav");

AudioInputStream audioInputStream =

AudioSystem.getAudioInputStream(fileIn);

int avail= audioInputStream.available();

System.out.println("bytes available " +avail);

System.out.println(audioInputStream.markSupported());

int bytesPerFrame =

        audioInputStream.getFormat().getFrameSize();

      // Set an arbitrary buffer size of 1024 frames.

int numBytes = 1024 * bytesPerFrame;

byte[] audioBytes = new byte[numBytes];

audioInputStream.read(audioBytes);

byte btext[]=Stego_text("good morning!");

byte bcoded[]=steg.encoding(audioBytes,btext,0);



 byte[] stg= a.decode_text(audioBytes);

 String obtain= new String(stg);

        System.out.println(">>>"+ obtain); //the hidden message gets successfully displayed here





try {

   //

            AudioSystem.write(audioInputStream, Type.WAVE, new File("C:\\Users\\Rahul\\Desktop\\pro\\Don't Stay_restored.wav"));

        } catch (Exception e) {



            e.printStackTrace();

        }

        byte[] audioBytesNew = new byte[numBytes];

        audioInputStream.read(audioBytesNew);

        byte[] stg1= a.decode_text(audioBytesNew);

        String obtain1= new String(stg1);

        System.out.println(">>>"+ obtain1); //the hidden message does not get displayed 

如果我在编辑后解码字节数组,那么它可以正常工作并显示隐藏的消息,但是在再次创建一个字节数组并读入它的 audioinputsream 数据然后解码该字节数组之后......它不起作用。我想知道为什么?请帮我。

4

1 回答 1

1

前 44 个字节确实是 WAV 的标头(请参阅https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

如果您在 HEX 编辑器中打开文件,您会看到它的样子 ( http://imgur.com/iliA40R )

如果你比较文件中的数据和你的 InputStream 读取的数据,它匹配。

如果您需要再次读取文件,您应该关闭并重新打开您的流。如果你可以标记文件,你可以在读取之前标记它,并在第一次读取完成后调用 reset()。

于 2013-04-11T17:54:31.293 回答