오디오 프로그래밍에서 표준 WAV 파일 헤더 생성은 기본이지만 중요한 단계입니다. WAV 파일은 RIFF (Resource Interchange 파일 형식) 형식을 기반으로 한 오디오 파일이며, 명확한 구조와 읽기 쉬운. 이 기사는 PHP의 Pack () 함수를 통해 정당한 WAV 파일 헤더를 수동으로 구성하여 개발자가 WAV 형식의 구조를 더 깊이 이해할 수 있도록합니다.
표준 WAV 파일 헤더는 대략 다음 부분으로 나눌 수 있습니다.
리프 블록 : 태그 파일은 리프 파일입니다.
웨이브 플래그 : 파일 유형은 웨이브입니다.
FMT 서브 블록 : 오디오 형식 정보 (샘플링 속도, 채널 번호, 비트 속도 등)를 포함합니다.
Data Sub-Block : 실제 오디오 데이터를 포함합니다.
구조는 다음과 같습니다.
| ChunkID | ChunkSize | Format |
|--------|-----------|--------|
| 'RIFF' | 36 + SubChunk2Size | 'WAVE' |
| Subchunk1ID | Subchunk1Size | AudioFormat | NumChannels | SampleRate | ByteRate | BlockAlign | BitsPerSample |
|-------------|----------------|-------------|-------------|------------|----------|-------------|----------------|
| Subchunk2ID | Subchunk2Size | Data |
PHP의 Pack () 함수는 데이터를 이진 문자열로 패키지 할 수 있으며, 이는 WAV 파일 헤더를 구성하는 데 적합합니다. 다음은 오디오 데이터 크기가 $ Datasize 바이트라고 가정 할 때 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 下载测试문서。";
$ 샘플 리터 : 샘플링 속도, 공통 값은 44100, 48000 등입니다.
$ BITSPERSALLE : 각 샘플의 비트 깊이 (일반적으로 8 또는 16).
$ 채널 : 채널 수, 1은 모노, 2는 스테레오입니다.
$ DataSize : 오디오 데이터의 실제 바이트 수는 다음과 같이 계산됩니다. 초 * 샘플링 속도 * 채널 * 비트 깊이 / 8 .
pack ()을 사용하여 WAV 파일 헤더 구축 : 다음 시나리오에서 사용하기에 이상적입니다.
서버 측에서 오디오 스트림을 동적으로 생성합니다.
사용자 정의 오디오 녹음 형식의 내보내기.
데이터 압축 및 오디오 포장 분석 도구 개발.