現在の位置: ホーム> 最新記事一覧> Pack()を使用して、画像/オーディオメタデータヘッダー情報を作成します

Pack()を使用して、画像/オーディオメタデータヘッダー情報を作成します

M66 2025-05-29

バイナリデータを処理する場合、PHPは非常に強力な機能-Pack ()を提供します。特定の形式に従ってバイナリ文字列にデータをパッケージ化できます。これは、写真、オーディオなどのメディアファイルのメタデータヘッダー情報を作成するのに非常に役立ちます。たとえば、WAVオーディオファイルのヘッダー情報を構築するか、BMPイメージのファイルヘッダーを生成する場合、 Pack()は有能です。

pack()とは?

Pack()関数の基本的な構文は次のとおりです。

 string pack(string $format, mixed ...$values)
  • $フォーマットは、各値をバイナリに変換する方法を指定するフォーマット文字列です。

  • $値は、変換される1つ以上の値です。

一般的な形式の文字は次のとおりです。

  • C :署名されていない文字(8ビット)

  • N :署名されていない短い整数(16ビット、ビッグエンディアン)

  • V :署名されていない短い整数(16ビット、小エンディアン)

  • N :署名されていない長い整数(32ビット、ビッグエンディアン)

  • V :署名されていない長い(32ビット、小エンディアン)

  • A :nulは文字列を埋めます

  • A :スペースが文字列を埋めます

例1:WAVオーディオファイルのヘッダー情報の作成

WAVファイルのファイルヘッダーは、RIFF形式に従い、通常は44バイトヘッダーで構成されています。これは、最小限のWAVファイルヘッダー構造の例です。

 <?php
$sampleRate = 44100;
$bitsPerSample = 16;
$channels = 2;
$dataSize = 100000; // オーディオデータサイズ,仮定する 100000 バイト
$byteRate = $sampleRate * $channels * $bitsPerSample / 8;
$blockAlign = $channels * $bitsPerSample / 8;

// 構造 WAV ファイルヘッダー
$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
);

// 実際のファイルとして出力
file_put_contents('output.wav', $header);
?>

スクリプトは、 output.WAVファイルヘッダーを作成し、実際のオーディオデータを添付して再生可能なWAVファイルを生成できます。

例2:BMP画像のファイルヘッダーを構築する

BMPファイルは、 Pack()を使用して構築できる固定フォーマットヘッダーも使用します。

 <?php
$width = 100;
$height = 100;
$bitsPerPixel = 24;
$rowSize = (int)(($bitsPerPixel * $width + 31) / 32) * 4;
$imageSize = $rowSize * $height;
$fileSize = 54 + $imageSize; // 54 バイト的头部 + 画像データ

$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
);

// ファイルへの出力ヘッダー
file_put_contents('output.bmp', $header);
?>

次に、画像ファイルを完成させるために、ピクセルデータの各行を入力できます(BMPの各行は4バイトでアライメントする必要があることに注意してください)。

注意すべきこと

  1. バイトの順序の問題:マルチバイト番号は、プラットフォームの終了順序を検討し、 VまたはNを使用して制御する必要があります(リトルエンディアンまたはビッグエンディアン)。

  2. アライメント要件:BMP、WAV、その他の形式には、フィールドアライメントと構造順序に関する厳しい要件があります。 pack()を使用する場合、フィールドが正確に対応することを確認する必要があります。

  3. デバッグ出力bin2hex()またはunpack()を使用して、パッケージの結果が期待を満たしているかどうかを確認できます。

  4. 複雑なファイルヘッダーを構築します:手動で解析し、公式形式の仕様と組み合わせてPack()呼び出しに変換できます。たとえば、ID3v2オーディオヘッドまたはPNGのIHDRブロックを生成するには、関連するドキュメントを必ず参照してください。

結論