Signatur
Beschreibung
openal_stream ist Teil der PHP-OpenAL-Extension und ermöglicht das schrittweise Übertragen von Audio-Rohdaten an eine zuvor erzeugte OpenAL-Audioquelle. Im Gegensatz zum vollständigen Befüllen eines Puffers mit openal_buffer_data können mit dieser Funktion Audiodaten in kleinen Häppchen (Chunks) gestreamt werden – ideal für große Audiodateien oder Live-Audiodaten.
Die Funktion erwartet eine gültige OpenAL-Quelle (erzeugt mit openal_source_create), ein Format-Handle (erzeugt mit openal_stream selbst oder definiert durch openal_buffer_create-Workflow) sowie einen Binär-String mit den eigentlichen PCM-Audiodaten. Das Format legt Bittiefe, Kanalanzahl und Samplingrate fest.
Diese Funktion ist besonders nützlich bei der Implementierung von Streaming-Playern, bei denen Audiodaten aus einer Datei oder einem Netzwerk-Stream stückweise verarbeitet und abgespielt werden sollen, ohne den gesamten Inhalt vorher in den Speicher laden zu müssen.
Hinweis: Die OpenAL-Extension für PHP ist nicht standardmäßig in PHP enthalten und muss separat installiert werden (PECL-Paket openal). Die Verfügbarkeit dieser Funktion hängt stark von der Systemkonfiguration ab.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $source Pflicht | resource | Eine gültige OpenAL-Quellen-Ressource, wie sie von openal_source_create zurückgegeben wird. Gibt an, an welche Audioquelle die Daten gestreamt werden sollen. |
|
| $format Pflicht | resource | Eine Ressource, die das Audio-Format beschreibt (z. B. Mono/Stereo, 8-Bit/16-Bit, Samplingrate). Wird typischerweise mit openal_stream im Initialisierungsschritt oder über Format-Konstanten festgelegt. |
|
| $data Pflicht | string | Ein binärer String mit den zu streamenden PCM-Audiodaten. Die Daten müssen dem angegebenen Format entsprechen. |
Rückgabewert
true zurück, wenn die Daten erfolgreich an die Quelle gestreamt wurden, oder false im Fehlerfall (z. B. ungültige Ressource oder inkompatibles Format).Beispiele
Einfaches Audio-Streaming mit OpenAL
<?php
// OpenAL-Gerät öffnen
$device = openal_device_open();
$context = openal_context_create($device);
openal_context_current($context);
// Quelle und Puffer erstellen
$source = openal_source_create();
// PCM-Audiodaten (16-Bit Mono, 44100 Hz) aus Datei lesen
$pcmData = file_get_contents('audio_chunk.raw');
// Puffer erstellen und mit Daten befüllen
$buffer = openal_buffer_create();
openal_buffer_data($buffer, AL_FORMAT_MONO16, $pcmData, 44100);
// Puffer an Quelle binden und Wiedergabe starten
openal_source_set($source, AL_BUFFER, $buffer);
openal_source_play($source);
// Warten bis Wiedergabe beendet
while (openal_source_get($source, AL_SOURCE_STATE) == AL_PLAYING) {
usleep(10000);
}
// Aufräumen
openal_source_destroy($source);
openal_buffer_destroy($buffer);
openal_context_destroy($context);
openal_device_close($device);
echo "Wiedergabe abgeschlossen.\n";
?>
Chunk-weises Streaming von Audio-Daten
<?php
$device = openal_device_open();
$context = openal_context_create($device);
openal_context_current($context);
$source = openal_source_create();
$file = fopen('grosse_audiodatei.raw', 'rb');
$chunkSize = 4096; // 4 KB pro Chunk
while (!feof($file)) {
$chunk = fread($file, $chunkSize);
if ($chunk === false || strlen($chunk) === 0) {
break;
}
// Chunk streamen
$result = openal_stream($source, AL_FORMAT_MONO16, $chunk);
if (!$result) {
echo "Fehler beim Streamen eines Chunks.\n";
break;
}
// Kurze Pause, damit OpenAL die Daten verarbeiten kann
usleep(5000);
}
fclose($file);
openal_source_destroy($source);
openal_context_destroy($context);
openal_device_close($device);
echo "Streaming abgeschlossen.\n";
?>
// Wichtig · Fallstricke
Verfügbarkeit: Die OpenAL-Extension ist kein Bestandteil der PHP-Standardinstallation. Sie muss über PECL (pecl install openal) installiert und in der php.ini aktiviert werden. Die Extension wird nur auf bestimmten Betriebssystemen unterstützt und ist unter Windows nur eingeschränkt verfügbar.
Ressourcen-Verwaltung: Alle erzeugten OpenAL-Ressourcen (Gerät, Kontext, Quellen, Puffer) müssen nach der Verwendung explizit freigegeben werden, um Speicherlecks zu vermeiden. Vergessene Ressourcen können zu instabilem Verhalten führen.
Format-Konsistenz: Die gestreamt übergebenen Daten müssen exakt dem angegebenen Format entsprechen. Falsche Bittiefe, Kanalanzahl oder Samplingrate führen zu verzerrter oder nicht abspielbarer Ausgabe.