Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Ach komm, nu übertreib doch nicht gleichfanste hat gesagt.:Wenn man im Int etwas darüber findet, ist es denke ich mal weniger ein Problem soetwas zu realisieren, aber ist dennoch ein verdammt großer Aufwand, bis das Script steht.
<?php
/**
* Einstellungen/Initialisierung
*/
// Samplingrate der Wavedatei
$samprate = 8000;
// Länge eines Tons in Sekunden
$soundlen = 0.25;
// Töne erzeugen
$lowsound = createPCMSound(440, $soundlen, $samprate);
$highsound = createPCMSound(880, $soundlen, $samprate);
$data = '';
/**
* Datei einlesen
*/
$fp = fopen('test.dat', 'r');
while (($char = fgetc($fp)) !== false) {
$byte = ord($char);
for ($i = 7; $i >= 0; $i--) {
$bit = $byte & (1 << $i);
if ($bit == 0) {
$data .= $lowsound;
} else {
$data .= $highsound;
}
}
}
fclose($fp);
/**
* Wavedatei schreiben
*/
createWaveFile('mywave.wav', $data, $samprate);
/**
* Funktionen
*/
/**
* Erzeugt eine Bytefolge, die einen Ton im PCM-Format repräsentiert.
* Sampleformat ist immer 8-bit mono.
*
* @param integer $freq Frequenz des Tons
* @param float $duration Dauer des Tons
* @param integer $samprate Samplingrate
*
* @return string Die erzeugte Bytefolge
*/
function createPCMSound($freq, $duration, $samprate = 8000)
{
$sound = '';
$samples = $duration * $samprate;
$timestep = 1 / $samprate;
$period = 1 / $freq;
for ($sample = 0, $time = 0; $sample < $samples; ++$sample, $time = $sample * $timestep) {
$amplitude = sin(($time / $period) * 2 * pi());
// Amplitude von Bereich [-1;1] auf [0;255] bringen
$bytevalue = floor(($amplitude + 1) / 2 * 255);
$sound .= pack('C', $bytevalue);
}
return $sound;
}
/**
* Schreibt eine Wavedatei aus Rohdaten und Samplingrate.
* Das Sampleformat ist immer 8-bit mono.
*
* @param string $filename Dateiname der zu erzeugenden Wavedatei
* @param string $data Rohdaten
* @param integer $samprate Verwendete Samplingrate
*/
function createWaveFile($filename, &$data, $samprate = 8000)
{
$wavehdr = 'WAVEfmt '.pack('VvvVVvv',
16, // Chunklänge
0x0001, // Format WAVE_FORMAT_PCM
0x0001, // Kanäle
$samprate, // Samplingrate
$samprate, // Bytes pro Sekunde (bei 8-bit mono gleich der Samplingrate)
1, // Blockgröße
8 // Bits pro Sample
);
$datalen = strlen($data);
$datahdr = 'data'.pack('V', $datalen);
$fp = fopen($filename, 'w');
fwrite($fp, 'RIFF'.pack('V', strlen($wavehdr) + $datalen));
fwrite($fp, $wavehdr);
fwrite($fp, $datahdr);
fwrite($fp, $data);
fclose($fp);
}
?>
Matthias Reitinger hat gesagt.:Ach komm, nu übertreib doch nicht gleich
Weil ich es nicht lassen konnte, hier mal ein Beispielscript:
PHP:<?php /** * Einstellungen/Initialisierung */ // Samplingrate der Wavedatei $samprate = 8000; // Länge eines Tons in Sekunden $soundlen = 0.25; // Töne erzeugen $lowsound = createPCMSound(440, $soundlen, $samprate); $highsound = createPCMSound(880, $soundlen, $samprate); $data = ''; /** * Datei einlesen */ $fp = fopen('test.dat', 'r'); while (($char = fgetc($fp)) !== false) { $byte = ord($char); for ($i = 7; $i >= 0; $i--) { $bit = $byte & (1 << $i); if ($bit == 0) { $data .= $lowsound; } else { $data .= $highsound; } } } fclose($fp); /** * Wavedatei schreiben */ createWaveFile('mywave.wav', $data, $samprate); /** * Funktionen */ /** * Erzeugt eine Bytefolge, die einen Ton im PCM-Format repräsentiert. * Sampleformat ist immer 8-bit mono. * * @param integer $freq Frequenz des Tons * @param float $duration Dauer des Tons * @param integer $samprate Samplingrate * * @return string Die erzeugte Bytefolge */ function createPCMSound($freq, $duration, $samprate = 8000) { $sound = ''; $samples = $duration * $samprate; $timestep = 1 / $samprate; $period = 1 / $freq; for ($sample = 0, $time = 0; $sample < $samples; ++$sample, $time = $sample * $timestep) { $amplitude = sin(($time / $period) * 2 * pi()); // Amplitude von Bereich [-1;1] auf [0;255] bringen $bytevalue = floor(($amplitude + 1) / 2 * 255); $sound .= pack('C', $bytevalue); } return $sound; } /** * Schreibt eine Wavedatei aus Rohdaten und Samplingrate. * Das Sampleformat ist immer 8-bit mono. * * @param string $filename Dateiname der zu erzeugenden Wavedatei * @param string $data Rohdaten * @param integer $samprate Verwendete Samplingrate */ function createWaveFile($filename, &$data, $samprate = 8000) { $wavehdr = 'WAVEfmt '.pack('VvvVVvv', 16, // Chunklänge 0x0001, // Format WAVE_FORMAT_PCM 0x0001, // Kanäle $samprate, // Samplingrate $samprate, // Bytes pro Sekunde (bei 8-bit mono gleich der Samplingrate) 1, // Blockgröße 8 // Bits pro Sample ); $datalen = strlen($data); $datahdr = 'data'.pack('V', $datalen); $fp = fopen($filename, 'w'); fwrite($fp, 'RIFF'.pack('V', strlen($wavehdr) + $datalen)); fwrite($fp, $wavehdr); fwrite($fp, $datahdr); fwrite($fp, $data); fclose($fp); } ?>
Funktioniert für kleine Dateien und kurze Tonlängen ganz passabel. Da aber sämtliche Rohdaten im Speicher generiert und erst dann in die Wavedatei geschrieben werden, kann es bei größeren Datenmengen zu hoher Speicher-/CPU-Belastung kommen. Aber das ließe sich mit etwas Aufwand auch abstellen.
$bit = $byte & (1 << $i);
if ($bit == 0) {
$data .= $lowsound;
} else {
$data .= $highsound;
}
$bit = $byte & (1 << $i);
Das Zurückwandeln wird wohl etwas komplizierter werden, ist aber keinesfalls unmöglich.kevkev hat gesagt.:Ich denke jetzt werde Ich es hinbekommen das ganze auch wieder zurückzu wandeln!
Spitze !
Die Variablenbezeichnung $bit ist zugegebenerweise etwas irreführend. Zur Erklärung der Werte:Edit2:
In dem Teil legst du ja fest, wenn das Bit 0 oder eine andere Zahl ist, ob ein hoher oder tiefer Ton eingefügt werden soll.PHP:$bit = $byte & (1 << $i); if ($bit == 0) { $data .= $lowsound; } else { $data .= $highsound; }
Wenn Ich aber mal $bit ausgebe, kommen auch andere Zahlen vor, nicht nur 1 oder 0 ?
<< ist ein Bitshift-Operator. Er schiebt die Bits im linken Operanden um die durch den rechten Operanden gegebene Anzahl an Stellen nach links. So bekomme ich in den Schleifendurchläufen die Werte 1000000b, 01000000b, 00100000b usw.Und könntest du mal erklären was das hier macht:
Dieses & und <<, was machen die denn ?PHP:$bit = $byte & (1 << $i);
Also… bei einer Frequenz ($freq) von x Hz muss die Lautsprechermembran x mal pro Sekunde schwingen. Das heißt, dass für eine einzelne Schwingung 1/x Sekunden Zeit bleiben. Das ist die Periodendauer ($period).fanste hat gesagt.:Könntest du mir erklären, wie genau das mit der Sinus-Berechnung funktioniert, oder mir eine Seite sagen, auf der das in guter verständlicher Form geschildert wird?