ส่วนขยายนี้สามารถแปลงไฟล์คลื่นเสียงรูปแบบ PCM เป็นไฟล์เสียงรูปแบบ WAV ได้อย่างรวดเร็ว ปัจจุบันมีเฉพาะโซลูชันสำหรับโครงการของบริษัทเท่านั้น
การอ้างอิงเพิ่มเติมอยู่ใน helviojunior/WaveGenerator ขอขอบคุณเป็นพิเศษสำหรับคุณ!
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
และ WAV
คืออะไร? PCM
: PCM (การปรับรหัสพัลส์ ---- การบันทึกการปรับรหัสพัลส์) สิ่งที่เรียกว่าการบันทึก PCM
คือการแปลงสัญญาณแอนะล็อก เช่น เสียง ให้เป็นสัญญาณพัลส์สัญลักษณ์แล้วจึงบันทึก สัญญาณ PCM
เป็นสัญญาณดิจิทัลที่ประกอบด้วย 1
, 0
และสัญลักษณ์อื่นๆ โดยไม่มีการเข้ารหัสหรือการประมวลผลการบีบอัด เมื่อเปรียบเทียบกับสัญญาณแอนะล็อก จะมีความไวต่อสัญญาณรบกวนและการบิดเบือนในระบบส่งสัญญาณน้อยกว่า ช่วงไดนามิกกว้างและคุณภาพเสียงค่อนข้างดี
WAV
: WAV
เป็นรูปแบบไฟล์เสียงแบบไม่สูญเสียข้อมูล WAV
เป็นไปตามข้อกำหนด PIFF (รูปแบบไฟล์การแลกเปลี่ยนทรัพยากร) WAV
ทั้งหมดมีส่วนหัวของไฟล์ซึ่งประกอบด้วยพารามิเตอร์การเข้ารหัสของสตรีมเสียง WAV ไม่มีกฎที่ยากและรวดเร็วในการเข้ารหัสสตรีมเสียง นอกเหนือจาก PCM
แล้ว การเข้ารหัสเกือบทั้งหมดที่รองรับข้อกำหนด ACM
ยังสามารถเข้ารหัสสตรีมเสียง WAV ได้
PCM
และ WAV
พูดง่ายๆ ก็คือ PCM
เป็นข้อมูลต้นฉบับของเสียง และ WAV
เป็นคอนเทนเนอร์ที่ห่อหุ้มข้อมูลเสียง และรูปแบบนั้นง่ายมาก เพียงเพิ่มข้อมูลส่วนหัวบางส่วนที่เกี่ยวข้องกับข้อมูลเสียงที่จุดเริ่มต้นของข้อมูล
ก่อนอื่น มาดูกฎรูปแบบของ WAV ดังที่แสดงด้านล่าง
หลังจากเข้าใจกฎเหล่านี้แล้ว เราก็สามารถเริ่มเขียนโค้ดได้
1. ChunkID
มีขนาด 4 ไบต์ ค่าคงที่ "RIFF"
$ChunkID = array(0x52, 0x49, 0x46, 0x46); // RIFF 16进制的0x52等于10进制中的82,82对应的ASCII码为R
2. ChunkSize
มีขนาด 4 ไบต์ และค่าคือ 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size) หากข้อมูลต้นฉบับเป็น PCM จะถูกย่อให้เป็น 36 + SubChunk2Size
$ChunkSize = array(0x0, 0x0, 0x0, 0x0);
$ChunkSize = self::getLittleEndianByteArray(36 + $dataSize);
3. Format
ใช้พื้นที่ 4 ไบต์ค่าคงที่ "WAVE"
$FileFormat = array(0x57, 0x41, 0x56, 0x45); // WAVE
4. Subchunk1ID
มีขนาด 4 ไบต์ ค่าคงที่ "ftm" (สังเกตช่องว่างที่ครบ 4 หลัก)
$Subchunk1ID = array(0x66, 0x6D, 0x74, 0x20); // fmt
5. Subchunk1Size
มีขนาด 4 ไบต์ และเมื่อข้อมูลเป็น PCM ค่าจะเป็น 16
$Subchunk1Size = array(0x10, 0x0, 0x0, 0x0); // 16 little endian
6. AudioFormat
มีขนาด 2 ไบต์ เมื่อข้อมูลเป็น PCM ค่าจะเป็น 1 ค่าอื่นๆ แสดงว่าข้อมูลถูกบีบอัดในทางใดทางหนึ่ง
$AudioFormat = array(0x1, 0x0); // PCM = 1 little endian
7. NumChannels
มีพื้นที่ 2 ไบต์ ซึ่งสอดคล้องกับ channelConfig ใน AudioRecord, Mono = 1, Stereo = 2
if ($numchannels == 2) {
$fmt->NumChannels = array(0x2, 0x0); // 立体声为2
} else {
$fmt->NumChannels = array(0x1, 0x0); // 单声道为1
}
8. SampleRate
กินพื้นที่ 4 ไบต์ ซึ่งสอดคล้องกับ SampleRateInHz ใน AudioRecord ซึ่งเป็นความถี่ในการสุ่มตัวอย่าง เช่น 8000, 16000, 44100
$SampleRate = self::getLittleEndianByteArray($samplerate);
9. ByteRate
ครอบครอง 4 ไบต์ และค่าคือ SampleRate * BlockAlign
self::getLittleEndianByteArray($samplerate * $numchannels * ($bitspersample / 8));
10. BlockAlign
มีขนาด 2 ไบต์ โดยมีค่าเป็น NumChannels * BitsPerSample / 8
self::getLittleEndianByteArray($numchannels * ($bitspersample / 8), true);
11. BitsPerSample
ใช้พื้นที่ 2 ไบต์ ซึ่งสอดคล้องกับรูปแบบเสียงใน AudioRecord, 8 บิต = 8, 16 บิต = 16
self::getLittleEndianByteArray($bitspersample, true);
12. Subchunk2ID
ครอบครอง 4 ไบต์ซึ่งเป็นค่าคงที่ "data" นั่นคือ
$Subchunk2ID = array(0x64, 0x61, 0x74, 0x61); // data
13. Subchunk2Size
ใช้พื้นที่ 4 ไบต์ ซึ่งอธิบายความยาวของข้อมูลเสียง ซึ่งเป็นขนาดของไฟล์ pcm
self::getLittleEndianByteArray(filesize($filename));
14. Data
คิดเป็นไบต์ของขนาดไฟล์ pcm ซึ่งแสดงถึงข้อมูลเสียง PCM ดั้งเดิม
คำอธิบายวิธีการ getLittleEndianByteArray
getLittleEndianByteArray
ประมวลผลตัวเลขที่ส่งผ่านเป็นหลักและแปลงเป็นข้อมูลที่จำเป็นต้องใช้ ความยาวของอาร์เรย์จะถูกส่งกลับตามจำนวนไบต์
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;
}
ข้อมูล 44 ไบต์แรกในไฟล์ทั้งหมดได้รับการอธิบายโดยพื้นฐานแล้ว เรามาพูดถึงการนำไฟล์คลาสการประมวลผลไปใช้กัน ขั้นแรกตรรกะการประมวลผลจะสร้างไฟล์ที่มีขนาดเพียง 44 ไบต์ชั่วคราว จากนั้นจึงผนวกข้อมูลของไฟล์ PCM
เข้ากับ ในที่สุดตามกฎรูปแบบ WAV ข้อมูลส่วนหัวจริง 44 ไบต์จะถูกคำนวณและตัวชี้การแก้ไขไฟล์จะชี้ไปที่จุดเริ่มต้นของไฟล์จากนั้นแก้ไขเป็นข้อมูลที่สร้างขึ้นใหม่