WAV PCM文件的最大優(yōu)點(diǎn)在于,你無(wú)需進(jìn)行任何綁定操作,就能將來(lái)自?xún)蓚€(gè)文件的二進(jìn)制音頻數據連接起來(lái)。你只需把其中一個(gè)文件的二進(jìn)制數據粘合到另一個(gè)文件的末尾,再調整一下Subchunk2Size值,即可實(shí)現兩個(gè)文件的接合。唯一的缺點(diǎn)是這兩個(gè)文件的格式必須相同;在本例中,不涉及問(wèn)題。
當解析音頻文件時(shí),先將二進(jìn)制音頻數據讀入一個(gè)緩沖數組中,然后再將另一個(gè)文件的數據讀到這個(gè)數組的末端。重復這一過(guò)程直到所有的文件都被讀取完畢。創(chuàng )建一個(gè)FILESTRUCT結構,填入格式信息,調整Subchunk2Size值,將Data成員設為緩沖數組,將FILESTRUCT寫(xiě)為需要的輸出格式。對于基于PHP的Web發(fā)布系統,其輸出為標準輸出。以下為示范代碼:
本調用的第一個(gè)參數是對FILESTRUCT對象的引用。第二個(gè)參數是對一列文件名字符串的引用。在每次for循環(huán)中,我都將列表中的一個(gè)文件名載入一個(gè)FILESTRUCT中,然后再將每一個(gè)FILESTRUCT的Data屬性提取出來(lái),并合并到一個(gè)現有的緩沖區中。完成以上操作后,我通過(guò)一個(gè)事先聲明的全局變量對FILESTRUCT參數對象的屬性進(jìn)行設定,然后改變Subchunk2Size屬性,并將Data屬性設為新的緩沖區。
你可能注意到,我使用了一些功能函數來(lái)填充FILESTRUCT結構、計算來(lái)自little endian字節數組的數值、創(chuàng )建little endian字節數組和拆分字符串為二進(jìn)制數組。以下為這些函數:
為了實(shí)現這個(gè)類(lèi)的功能,你可以創(chuàng )建一個(gè)CStitcher實(shí)例并調用StitchFiles()方法,以傳遞合適的參數:
$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);
可用以下代碼將二進(jìn)制數據寫(xiě)到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>