使视觉有障碍的用户能够使用OCR-defeating pass code的方法之一是WAV文件接合技术。
本文中,我将演示如何解构一组WAV文件,并将文件重新编译后重组为一个大型的WAV文件。(注意,这里我使用了ASP 和Visual Basic。)
了解Microsoft PCM WAV文件
Microsoft PCM WAV文件包含的信息有音频类型、音频格式、以及被拆分为3“大块”的音频数据。第一块包含了ChunkID、ChunkSize和 Format,负责通知软件该文件是一个WAVE音频文件。
第二块包含Subchunk1ID、Subchunk1Size、AudioFormat、NumChannels、SampleRate、ByteRate、BlockAlign和BitsPerSample。各参量取值为:“fmt”;16(对于PCM);1(非压缩);1或2(单声道或立体声);8000、44100等;SampleRate * NumChannels * BitsPerSample/8;NumChannels * BitsPerSample/8;8、16等。
第三块包含Subchunk2ID、Subchunk2Size和数据: "data",数据量 (NumSamples * NumChannels * BitsPerSample/8)以及音频数据。只需以音频文件的形式读取和存储相应的字节即可提取出所需信息。
使用PHP的流函数
综合使用fopen()、fread()和fclose(),可将这些值读入本地变量中。我特别喜欢将文件信息存储在结构体中以便于组织。可构造PHP中的一个类进行如下处理:
该文件结构体类包含了文件每一部分的大小信息。例如,ChunkID属性为一个4元数组,包含4个字节的信息。当我从文件中读取二进制数据时,可以使用count ()函数来计算文件数据的字节数。依照此法,可以获得其他文件信息。
接合WAV文件
当一位用户访问某一页面时,你希望能够提供一个由多个音频文件接合而成的一个大型音频文件。这就要求其中一个输入参数为一个文件路径数组。你要循环访问这些文件,载入文件信息到FILESTRUCT结构中,再构造一个新的FILESTRUCT结构用于存储接合后文件的信息。
我将构造一个类用于文件接合操作。主要原因是我在Visual Basic中使用了一个类模块来完成这一功能。这个类只有一个公共方法:StitchFiles。该方法可接受FILESTRUCT引用和文件数组。
class CStitcher {
function StitchFiles(&$fsFile, &$sFiles)
}
该方法负责接合操作的全过程。在以后的文章中我将更加深入地探讨实现方法。同时,我还将提供传输文件的源码和播放音频的HTML代码。