【PHP教程】PHP生成指定频率和声音的声音文件
<?phpdefine('M_SAMPLEFREQ', 44100);//采样频率44100
define('M_CHANNELS', 1);//通道数
define('M_CHANNELBITS', 16);//通道字节数
define('WAVE_HEAD_LENGTH', 44);//wav头文件长度
define('PI', 3.1415926535);//圆周率值
/**
* @param int $freq 频率
* @param int $volume 音量(分贝)
* @param int $durations 时间/毫秒
* @return mixed
*/
function makeWav($freq, $volume, $durations)
{
$totalLen = M_SAMPLEFREQ * M_CHANNELS * M_CHANNELBITS / 8 * $durations / 1000 + WAVE_HEAD_LENGTH;//文件总长度=(采样率 * 通道数 * 比特数 / 8) * 持续时间(s)
for ($i = 0; $i <= $totalLen; $i++) {
$wav[$i] = 0;
}
$wav = 82;
$wav = 73;
$wav = 70;
$wav = 70;
$headerLen = $totalLen - 8;//文件的总长度-8bits
$wav = $headerLen -->> 24 & 255;
$wav = $headerLen >> 16 & 255;
$wav = $headerLen >> 8 & 255;
$wav = ord(chr($headerLen));
$wav = 87;
$wav = 65;
$wav = 86;
$wav = 69;
$wav = 102;
$wav = 109;
$wav = 116;
$wav = 32;
$wav = 16;
$wav = 0;
$wav = 0;
$wav = 0;
$wav = 1;
$wav = 0;
$wav = M_CHANNELS;
$wav = 0;
$wav = ord(chr(M_SAMPLEFREQ));
$wav = M_SAMPLEFREQ >> 8 & 255;
$wav = M_SAMPLEFREQ >> 16 & 255;
$wav = M_SAMPLEFREQ >> 24 & 255;
$nAvgBytesPerSec = M_SAMPLEFREQ * M_CHANNELS * M_CHANNELBITS / 8;//每秒所需字节数
$wav = ord(chr($nAvgBytesPerSec));
$wav = $nAvgBytesPerSec >> 8 & 255;
$wav = $nAvgBytesPerSec >> 16 & 255;
$wav = $nAvgBytesPerSec >> 24 & 255;
$wav = 2;
$wav = 0;
$wav = M_CHANNELBITS;
$wav = 0;
$wav = 100;
$wav = 97;
$wav = 116;
$wav = 97;
$dataLen = $totalLen - WAVE_HEAD_LENGTH;//数据的长度,=文件总长度-头长度(44bit)
$wav = $dataLen >> 24 & 255;
$wav = $dataLen >> 16 & 255;
$wav = $dataLen >> 8 & 255;
$wav = ord(chr($dataLen));
$len = $totalLen - WAVE_HEAD_LENGTH;
wavData(M_SAMPLEFREQ, $freq, $volume, $wav, WAVE_HEAD_LENGTH, $len);
}
return $wav;
}
function wavData($rate, $freq, $amp, &$p, $pp, $len)
{
for ($i = 0; $i <= $len - 1; $i += 2) {
$v = sin(($len - $i) * PI / $rate * $freq) / 180 * ($amp * 32768 + 32768);
$p[$pp + $i] = $v & 255;//低字节在前
$p[$pp + $i + 1] = $v >> 8 & 255;//高字节在后
}
}
$data = makeWav(2000, 89, 1000);
$res = fopen('./test.wav', 'wb');
foreach($data as $v){
$bin .= pack("c*", $v);
}
fwrite($res, $bin, strlen($bin));
fclose($res);
页:
[1]