Position actuelle: Accueil> Derniers articles> Utilisez Pack () pour créer des informations d'en-tête de métadonnées photo / audio

Utilisez Pack () pour créer des informations d'en-tête de métadonnées photo / audio

M66 2025-05-29

Lors du traitement des données binaires, PHP fournit une fonction très puissante - pack () . Il peut emballer des données dans des chaînes binaires en fonction du format spécifié, qui est très utile pour créer des informations d'en-tête de métadonnées pour les fichiers multimédias tels que des images, audio, etc. Par exemple, si vous souhaitez construire les informations d'en-tête d'un fichier audio WAV, ou générer un en-tête de fichier pour une image BMP, Pack () est compétent.

Qu'est-ce que Pack () ?

La syntaxe de base de la fonction Pack () est la suivante:

 string pack(string $format, mixed ...$values)
  • $ format est une chaîne de format qui spécifie comment chaque valeur doit être convertie en binaire.

  • $ Les valeurs sont une ou plusieurs valeurs à convertir.

Les caractères de format commun comprennent:

  • C : caractères non signés (8 bits)

  • N : entier court non signé (16 bits, Big-endian)

  • V : entier court non signé (16 bits, petit-endian)

  • N : entier long non signé (32 bits, Big Endian)

  • V : Long non signé (32 bits, petit-endian)

  • A : Nul remplit la chaîne

  • A : l'espace remplit la ficelle

Exemple 1: Création d'informations d'en-tête du fichier audio WAV

L'en-tête de fichier d'un fichier WAV suit le format de riff et est généralement composé d'un en-tête de 44 octets. Voici un exemple d'une construction en tête de fichier WAV minimale:

 <?php
$sampleRate = 44100;
$bitsPerSample = 16;
$channels = 2;
$dataSize = 100000; // Taille des données audio,Supposer 100000 octet
$byteRate = $sampleRate * $channels * $bitsPerSample / 8;
$blockAlign = $channels * $bitsPerSample / 8;

// structure WAV En-tête de fichier
$header = pack(
    'A4VVA4A4VVvvVVvvA4V',
    'RIFF',                // ChunkID
    36 + $dataSize,        // ChunkSize
    0x45564157,            // Format 'WAVE'
    'fmt ',                // Subchunk1ID
    16,                    // Subchunk1Size (PCM)
    1,                     // AudioFormat (1 = PCM)
    $channels,             // NumChannels
    $sampleRate,           // SampleRate
    $byteRate,             // ByteRate
    $blockAlign,           // BlockAlign
    $bitsPerSample,        // BitsPerSample
    'data',                // Subchunk2ID
    $dataSize              // Subchunk2Size
);

// Sortie en tant que fichier réel
file_put_contents('output.wav', $header);
?>

Le script crée un en-tête de fichier output.wav , que vous pouvez ensuite joindre les données audio réelles pour générer un fichier wav jouable.

Exemple 2: Construisez l'en-tête de fichier de l'image BMP

Les fichiers BMP utilisent également des en-têtes de format fixe, qui peuvent être construits à l'aide de Pack () .

 <?php
$width = 100;
$height = 100;
$bitsPerPixel = 24;
$rowSize = (int)(($bitsPerPixel * $width + 31) / 32) * 4;
$imageSize = $rowSize * $height;
$fileSize = 54 + $imageSize; // 54 octet的头部 + Données d&#39;image

$header = pack(
    'A2VvvVVVVvvVVVV',
    'BM',             // Signature
    $fileSize,        // File size
    0,                // Reserved1
    0,                // Reserved2
    54,               // Offset to image data
    40,               // Info header size
    $width,           // Width
    $height,          // Height
    1,                // Planes
    $bitsPerPixel,    // Bits per pixel
    0,                // Compression (none)
    $imageSize,       // Image size
    2835,             // X pixels per meter (72 DPI)
    2835,             // Y pixels per meter (72 DPI)
    0,                // Colors used
    0                 // Important colors
);

// En-tête de sortie vers le fichier
file_put_contents('output.bmp', $header);
?>

Ensuite, vous pouvez remplir chaque ligne de données de pixels (notez que chaque ligne de BMP doit être alignée de 4 octets) pour terminer le fichier image.

Choses à noter

  1. Problème de commande d'octets : les numéros multi-octets doivent considérer l'ordre de fin de la plate-forme et utiliser V ou N pour contrôler (Little Endian ou Big Endian).

  2. Exigences d'alignement : BMP, WAV et d'autres formats ont des exigences strictes sur l'alignement des champs et l'ordre structurel. Lorsque vous utilisez Pack () , vous devez vous assurer que les champs correspondent à précis.

  3. Débogage Sortie : vous pouvez utiliser bin2hex () ou déballer () pour voir si les résultats emballés répondent aux attentes.

  4. Construire des en-têtes de fichiers complexes : peut être analysé manuellement et converti en appels pack () en combinaison avec les spécifications officielles du format. Par exemple, pour générer un bloc IHDR d'une tête audio ID3V2 ou PNG, assurez-vous de consulter les documents pertinents.

Conclusion