オーディオプログラミングでは、標準のWAVファイルヘッダーを生成することは、基本的であるが重要なステップです。 WAVファイルは、RIFF(リソースインターチェンジファイル形式)形式に基づくオーディオファイルであり、クリア構造と読みやすいです。この記事では、PHPのPack()関数を介して正当なWAVファイルヘッダーを手動で構築し、開発者がWAV形式の構造をより深く理解できるようにします。
標準のWAVファイルヘッダーは、次の部分にほぼ分割できます。
リフブロック:タグファイルはリフファイルです。
ウェーブフラグ:ファイルタイプは波です。
FMTサブブロック:オーディオ形式情報(サンプリングレート、チャネル番号、ビットレートなど)が含まれています。
データサブブロック:実際のオーディオデータが含まれています。
構造は次のとおりです。
| ChunkID | ChunkSize | Format |
|--------|-----------|--------|
| 'RIFF' | 36 + SubChunk2Size | 'WAVE' |
| Subchunk1ID | Subchunk1Size | AudioFormat | NumChannels | SampleRate | ByteRate | BlockAlign | BitsPerSample |
|-------------|----------------|-------------|-------------|------------|----------|-------------|----------------|
| Subchunk2ID | Subchunk2Size | Data |
PHPのpack()関数は、WAVファイルヘッダーの構築に適したバイナリ文字列にデータをパッケージ化できます。オーディオデータサイズが$ DATASIZE BYTESであると仮定して、16ビット、モノ、44.1KHz WAVファイルヘッダーを生成する簡単な例を次に示します。
<?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;
}
// 例:空に書く WAV 書類
$dataSize = 44100 * 2 * 1; // 1数秒でモノ16ビットオーディオデータ
$header = createWavHeader($dataSize);
file_put_contents('output.wav', $header . str_repeat("\x00", $dataSize));
echo "WAV 書類已创建。で利用可能 m66.net 下载测试書類。";
$ samplerate :サンプリングレート、共通値は44100、48000などです。
$ bitspersample :各サンプルのビット深さ、通常は8または16。
$チャンネル:チャネル数、1はモノ、2はステレオです。
$ datasize :オーディオデータの実際のバイト数、秒 *サンプリングレート *チャネル *ビット深さ / 8として計算されます。
Pack()を使用してWAVファイルヘッダーの構築は、次のシナリオで使用するのに最適です。
サーバー側でオーディオストリームを動的に生成します。
カスタムオーディオ録音形式のエクスポート。
データ圧縮およびオーディオパッケージ分析ツールの開発。