Il problema è che l'algoritmo scrive i numeri come testo. Considerando che un file .wav
codifica il file binario dati.
È possibile utilizzare ad esempio pack
per raggruppare i dati.
$freqOfTone = 440;
$sampleRate = 44100;
$samplesCount = 80000;
$amplitude = 0.25 * 32768;
$w = 2 * pi() * $freqOfTone/$sampleRate;
$samples = array();
for ($n = 0; $n < $samplesCount; $n++) {
$samples[] = (int)($amplitude * sin($n * $w));
}
$srate = 44100; //sample rate
$bps = 16; //bits per sample
$Bps = $bps/8; //bytes per sample /// I EDITED
$str = call_user_func_array("pack",
array_merge(array("VVVVVvvVVvvVVv*"),
array(//header
0x46464952, //RIFF
160038, //File size
0x45564157, //WAVE
0x20746d66, //"fmt " (chunk)
16, //chunk size
1, //compression
1, //nchannels
$srate, //sample rate
$Bps*$srate, //bytes/second
$Bps, //block align
$bps, //bits/sample
0x61746164, //"data"
160000 //chunk size
),
$samples //data
)
);
$myfile = fopen("sine.wav", "wb") or die("Unable to open file!");
fwrite($myfile, $str);
fclose($myfile);
Questo produce file.
Si noti che non è possibile riutilizzare l'intestazione precedente. Alcuni aspetti erano hardcoded che differiscono (come la dimensione del file, il numero di canali, il bitrate, ecc.). Ma se si legge documentation, si può facilmente modificare l'intestazione di conseguenza.
fonte
2015-01-20 19:12:20
Scrivi i dati in "testo". Un file wave è "binario". –
Che cosa @CommuSoft sta cercando di dire è che devi scrivere i valori dei byte, non il contenuto del testo. Ad esempio, invece di scrivere ''44100'', devi scrivere i byte' 0xAC44'. –
@ Ismael Miguel - Allora perché non usa il valore byte per 80036? – lopata