Position actuelle: Accueil> Derniers articles> Comment générer des en-têtes de fichiers audio WAV standard à l'aide de la fonction Pack ()?

Comment générer des en-têtes de fichiers audio WAV standard à l'aide de la fonction Pack ()?

M66 2025-06-12

Dans la programmation audio, la génération d'en-têtes de fichiers WAV standard est une étape de base mais critique. Les fichiers WAV sont des fichiers audio basés sur le format RIFF (Resource Interchange File Format), avec une structure claire et facile à lire. Cet article construira manuellement un en-tête de fichier WAV légitime via la fonction PHP Pack () , afin que les développeurs puissent comprendre plus profondément la structure du format WAV.

Structure de base des fichiers WAV

Un en-tête de fichier WAV standard peut être à peu près divisé en parties suivantes:

  1. Bloc de riff : un fichier de balises est un fichier riff.

  2. Indicateur d'onde : le type de fichier est de l'onde.

  3. Sous-bloc FMT : contient des informations au format audio (taux d'échantillonnage, numéro de canal, débit binaire, etc.).

  4. Sous-bloc de données : contient les données audio réelles.

La structure est la suivante:

 | ChunkID | ChunkSize | Format |
|--------|-----------|--------|
| 'RIFF' | 36 + SubChunk2Size | 'WAVE' |

| Subchunk1ID | Subchunk1Size | AudioFormat | NumChannels | SampleRate | ByteRate | BlockAlign | BitsPerSample |
|-------------|----------------|-------------|-------------|------------|----------|-------------|----------------|

| Subchunk2ID | Subchunk2Size | Data |

Utilisez Pack () pour construire l'en-tête WAV

La fonction PACT () de PHP peut emballer les données en chaînes binaires, ce qui convient à la construction d'en-têtes de fichiers WAV. Voici un exemple simple pour générer un en-tête de fichier WAV 16 bits, mono, 44.1 kHz, en supposant que la taille des données audio est $ dataSize octets:

 <?php

function createWavHeader($dataSize, $sampleRate = 44100, $bitsPerSample = 16, $channels = 1)
{
    $byteRate = $sampleRate * $channels * $bitsPerSample / 8;
    $blockAlign = $channels * $bitsPerSample / 8;
    $header = '';

    // RIFF Header
    $header .= pack('A4', 'RIFF');                              // ChunkID
    $header .= pack('V', 36 + $dataSize);                       // ChunkSize
    $header .= pack('A4', 'WAVE');                              // Format

    // fmt Subchunk
    $header .= pack('A4', 'fmt ');                              // Subchunk1ID
    $header .= pack('V', 16);                                   // Subchunk1Size
    $header .= pack('v', 1);                                    // AudioFormat (1 = PCM)
    $header .= pack('v', $channels);                            // NumChannels
    $header .= pack('V', $sampleRate);                          // SampleRate
    $header .= pack('V', $byteRate);                            // ByteRate
    $header .= pack('v', $blockAlign);                          // BlockAlign
    $header .= pack('v', $bitsPerSample);                       // BitsPerSample

    // data Subchunk
    $header .= pack('A4', 'data');                              // Subchunk2ID
    $header .= pack('V', $dataSize);                            // Subchunk2Size

    return $header;
}

// Exemple:Écrivez un vide WAV document
$dataSize = 44100 * 2 * 1; // 1Mono en quelques secondes16Données audio bits
$header = createWavHeader($dataSize);
file_put_contents('output.wav', $header . str_repeat("\x00", $dataSize));

echo "WAV document已创建。Disponible dans m66.net 下载测试document。";

Description du paramètre

  • $ Samplerate : Le taux d'échantillonnage, les valeurs communes sont 44100, 48000, etc.

  • $ BitsPersample : La profondeur du bit de chaque échantillon, généralement 8 ou 16.

  • $ canaux : nombre de canaux, 1 est mono, 2 est stéréo.

  • $ dataSize : le nombre réel d'octets des données audio, calculé comme: secondes * Taux d'échantillonnage * canal * Bit Depth / 8 .

Scénarios d'application

La construction d'en-têtes de fichiers WAV à l'aide de pack () est idéale pour une utilisation dans les scénarios suivants:

  • Générez dynamiquement des flux audio du côté serveur.

  • Exportation du format d'enregistrement audio personnalisé.

  • Développement d'outils de compression de données et d'emballage audio.

Résumer