wangy 发表于 2021-6-20 21:51:47

【PHP教程】PHP生成指定频率和声音的声音文件

<?php



define('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]
查看完整版本: 【PHP教程】PHP生成指定频率和声音的声音文件