WAV PCM文件的最大優(yōu)點在于,你無需進行任何綁定操作,就能將來自兩個文件的二進制音頻數(shù)據(jù)連接起來。你只需把其中一個文件的二進制數(shù)據(jù)粘合到另一個文件的末尾,再調(diào)整一下Subchunk2Size值,即可實現(xiàn)兩個文件的接合。唯一的缺點是這兩個文件的格式必須相同;在本例中,不涉及問題。
當解析音頻文件時,先將二進制音頻數(shù)據(jù)讀入一個緩沖數(shù)組中,然后再將另一個文件的數(shù)據(jù)讀到這個數(shù)組的末端。重復這一過程直到所有的文件都被讀取完畢。創(chuàng)建一個FILESTRUCT結構,填入格式信息,調(diào)整Subchunk2Size值,將Data成員設為緩沖數(shù)組,將FILESTRUCT寫為需要的輸出格式。對于基于PHP的Web發(fā)布系統(tǒng),其輸出為標準輸出。以下為示范代碼:
本調(diào)用的第一個參數(shù)是對FILESTRUCT對象的引用。第二個參數(shù)是對一列文件名字符串的引用。在每次for循環(huán)中,我都將列表中的一個文件名載入一個FILESTRUCT中,然后再將每一個FILESTRUCT的Data屬性提取出來,并合并到一個現(xiàn)有的緩沖區(qū)中。完成以上操作后,我通過一個事先聲明的全局變量對FILESTRUCT參數(shù)對象的屬性進行設定,然后改變Subchunk2Size屬性,并將Data屬性設為新的緩沖區(qū)。
你可能注意到,我使用了一些功能函數(shù)來填充FILESTRUCT結構、計算來自little endian字節(jié)數(shù)組的數(shù)值、創(chuàng)建little endian字節(jié)數(shù)組和拆分字符串為二進制數(shù)組。以下為這些函數(shù):
為了實現(xiàn)這個類的功能,你可以創(chuàng)建一個CStitcher實例并調(diào)用StitchFiles()方法,以傳遞合適的參數(shù):
$ChunkID_ = array(0x52, 0x49, 0x46, 0x46); //"RIFF" big endian
$FileFormat_ = array(0x57, 0x41, 0x56, 0x45); //"WAVE" big endian
$Subchunk1ID_ = array(0x66, 0x6D, 0x74, 0x20); //"fmt" big endian
$AudioFormat_ = array(0x1, 0x0); //PCM = 1 little endian
$Stereo_ = array(0x2, 0x0); //Stereo = 2 little endian
$Mono_ = array(0x1, 0x0); //Mono = 1 little endian
$SampleRate_ = array(0x44, 0xAC, 0x0, 0x0); //44100 little endian
$BitsPerSample_ = array(0x10, 0x0); //16 little endian
$Subchunk2ID_ = array(0x64, 0x61, 0x74, 0x61); //"data" big endian
$files = array("C:\\Inetpub\\wwwroot\\Test\\PHP\\1.wav",
"C:\\Inetpub\\wwwroot\\Test\\PHP\\2.wav");
$Stitcher = new CStitcher();
$file = new FILESTRUCT();
$Stitcher->StitchFiles($file, $files);
可用以下代碼將二進制數(shù)據(jù)寫到HTTP輸出中:
以下是一段HTML代碼,用于測試結果:
<html>
<head>
<script language="JavaScript">
function play_soundbyte() {
bgsound1.src = "wavstitch.php";
}
</script>
</head>
<bgsound id="bgsound1" loop="1">
<body>
<a href="javascript:play_soundbyte();">Click here to play soundbyte.</a>
</body>
</html>