音频隐写术

5

我正在进行我的JAVA毕业项目。

1)在图像中隐藏文本

2)在图像中嵌入图像

3)在音频文件 (WAVE) 中嵌入文本

我已经成功完成了1)和2),如果有需要,我已经附上了源代码。但是我在第三个问题上遇到了麻烦,也就是将数据隐藏在音频文件中。我从一个wave文件创建一个audioinputstream,并将其数据读入一个字节数组,但读取时很多东西不清楚。我猜测前44个字节是头字节吗?(因为文件是WAVE格式),还是根本没有复制头文件。问题是,在解码时,我必须再次从新创建的音频文件中读取数据到一个字节数组中。而我无法找到我隐藏数据的字节。

有人能告诉我当我们从音频输入流中读取数据到一个字节数组时实际发生了什么,我的意思是实际上会有哪些数据被读入到字节数组中?

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 

如果我在编辑后立即解码字节数组,则可以正常工作并显示隐藏消息,但在再次创建字节数组并读取其音频输入流数据并解码该字节数组之后,它就无法正常工作。 我想知道为什么? 请帮忙。


2
这个词是“隐写术”。 - user207421
1个回答

1

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

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

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

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


非常感谢!我刚刚完成了我的项目。我使用DataInputStream来提取实际数据(不包括头文件),然后用它创建了一个AudioInputStream。 - Rahul Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接