Diese Erweiterung kann Schallwellendateien im PCM-Format schnell in Audiodateien im WAV-Format konvertieren. Derzeit bietet sie nur Lösungen für Unternehmensprojekte.
Die erweiterte Referenz befindet sich in helviojunior/WaveGenerator, besonderer Dank geht an Sie!
composer require jade/pcm-to-wav
use PcmToWav e P cmToWave ;
$input_file = ' ./file/test.pcm ' ; // 准备输入的文件
$output_file = ' ./file/test.wav ' ; // 预计输出的文件
$data = PcmToWav e::init( $pcm_file , $wav_file ) ; // 调用转换
进入扩展包目录
cd vendor/jade/pcm-to-wav
composer install
cd test
php Test.php
PCM
und WAV
? PCM
: PCM (Pulse Code Modulation – Aufzeichnung mit Pulse Code Modulation). Bei der sogenannten PCM
Aufzeichnung werden analoge Signale wie Ton in symbolische Impulsfolgen umgewandelt und anschließend aufgezeichnet. PCM
-Signal ist ein digitales Signal, das aus 1
, 0
und anderen Symbolen ohne jegliche Kodierungs- oder Komprimierungsverarbeitung besteht. Im Vergleich zu analogen Signalen ist es weniger anfällig für Rauschen und Verzerrungen im Übertragungssystem. Der Dynamikbereich ist groß und die Klangqualität kann recht gut sein.
WAV
: WAV
ist ein verlustfreies Audiodateiformat, WAV
der PIFF-Spezifikation (Resource Interchange File Format) entspricht. Alle WAV
verfügen über einen Dateiheader, der die Kodierungsparameter des Audiostreams enthält. WAV hat keine festen Regeln für die Codierung von Audiostreams. Zusätzlich zu PCM
können fast alle Codierungen, die ACM
Spezifikation unterstützen, WAV-Audiostreams codieren.
PCM
und WAV
Einfach ausgedrückt sind PCM
die Originaldaten von Audio, und WAV
ist ein Container, der Audiodaten kapselt, und sein Format ist sehr einfach. Es fügt lediglich einige Header-Informationen zu den Audiodaten am Anfang der Daten hinzu.
Werfen wir zunächst einen Blick auf die Formatregeln von WAV, wie unten gezeigt
Nachdem wir diese Regeln verstanden haben, können wir mit dem Codieren beginnen
1. ChunkID
belegt 4 Bytes, fester Wert „RIFF“
$ChunkID = array(0x52, 0x49, 0x46, 0x46); // RIFF 16进制的0x52等于10进制中的82,82对应的ASCII码为R
2. ChunkSize
belegt 4 Bytes und der Wert ist 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size). Wenn die Originaldaten PCM sind, wird er auf 36 + SubChunk2Size vereinfacht
$ChunkSize = array(0x0, 0x0, 0x0, 0x0);
$ChunkSize = self::getLittleEndianByteArray(36 + $dataSize);
3. Format
belegt 4 Byte, fester Wert „WAVE“
$FileFormat = array(0x57, 0x41, 0x56, 0x45); // WAVE
4. Subchunk1ID
belegt 4 Bytes, fester Wert „ftm“ (beachten Sie die Leerzeichenvervollständigung von 4 Ziffern)
$Subchunk1ID = array(0x66, 0x6D, 0x74, 0x20); // fmt
5. Subchunk1Size
belegt 4 Byte, und wenn die Daten PCM sind, beträgt der Wert 16
$Subchunk1Size = array(0x10, 0x0, 0x0, 0x0); // 16 little endian
6. AudioFormat
belegt 2 Bytes. Wenn die Daten PCM sind, ist der Wert 1. Andere Werte zeigen an, dass die Daten auf irgendeine Weise komprimiert wurden.
$AudioFormat = array(0x1, 0x0); // PCM = 1 little endian
7. NumChannels
belegt 2 Bytes, entsprechend channelConfig in AudioRecord, Mono = 1, Stereo = 2
if ($numchannels == 2) {
$fmt->NumChannels = array(0x2, 0x0); // 立体声为2
} else {
$fmt->NumChannels = array(0x1, 0x0); // 单声道为1
}
8. SampleRate
belegt 4 Bytes, entsprechend sampleRateInHz in AudioRecord, was der Abtastfrequenz entspricht, z. B. 8000, 16000, 44100
$SampleRate = self::getLittleEndianByteArray($samplerate);
9. ByteRate
belegt 4 Byte und der Wert ist SampleRate * BlockAlign
self::getLittleEndianByteArray($samplerate * $numchannels * ($bitspersample / 8));
10. BlockAlign
belegt 2 Bytes und der Wert ist NumChannels * BitsPerSample / 8
self::getLittleEndianByteArray($numchannels * ($bitspersample / 8), true);
11. BitsPerSample
belegt 2 Byte, entsprechend audioFormat in AudioRecord, 8 Bit = 8, 16 Bit = 16
self::getLittleEndianByteArray($bitspersample, true);
12. Subchunk2ID
belegt 4 Byte, also „Daten“ mit festem Wert
$Subchunk2ID = array(0x64, 0x61, 0x74, 0x61); // data
13. Subchunk2Size
belegt 4 Byte, was die Länge der Audiodaten beschreibt, was der Größe der PCM-Datei entspricht.
self::getLittleEndianByteArray(filesize($filename));
14. Data
machen Bytes der PCM-Dateigröße aus und repräsentieren die ursprünglichen PCM-Audiodaten.
Beschreibung der getLittleEndianByteArray
-Methode
getLittleEndianByteArray
verarbeitet hauptsächlich die übergebenen Zahlen und wandelt sie in die zu verwendenden Daten um. Die Länge des Arrays wird basierend auf der Anzahl der Bytes zurückgegeben.
private static function getLittleEndianByteArray($lValue, $short = false)
{
$b = array(0, 0, 0, 0);
$running = $lValue / pow(16, 6);
$b[3] = floor($running);
$running -= $b[3];
$running *= 256;
$b[2] = floor($running);
$running -= $b[2];
$running *= 256;
$b[1] = floor($running);
$running -= $b[1];
$running *= 256;
$b[0] = round($running);
if ($short) { // 为 `true` 时返回长度为2的数组
$tmp = array_slice($b, 0, 2);
$b = $tmp;
}
return $b;
}
Die ersten 44 Bytes an Informationen in der gesamten Datei wurden im Wesentlichen erläutert. Lassen Sie uns über die Implementierung der Verarbeitungsklassendateien sprechen. Die Verarbeitungslogik erstellt hier zunächst vorübergehend eine Datei mit nur 44 Bytes und hängt dann die Daten PCM
Datei an Schließlich werden gemäß den WAV-Formatregeln die tatsächlichen 44-Byte-Headerinformationen berechnet und der Dateiänderungszeiger auf den Anfang der Datei gezeigt und dann auf die neu generierten Daten geändert.