يمكن لهذا الامتداد تحويل ملفات الموجات الصوتية بتنسيق 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" (لاحظ اكتمال المساحة بأربعة أرقام)
$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 بايت، تتوافق مع تكوين القناة في AudioRecord، Mono = 1، Stereo = 2
if ($numchannels == 2) {
$fmt->NumChannels = array(0x2, 0x0); // 立体声为2
} else {
$fmt->NumChannels = array(0x1, 0x0); // 单声道为1
}
8. يشغل SampleRate
4 بايت، وهو ما يتوافق مع SampleRateIn هرتز في 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 بايت، وهي "بيانات" ذات قيمة ثابتة
$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 بايت ويشير مؤشر تعديل الملف إلى بداية الملف، ثم يتم تعديله إلى البيانات التي تم إنشاؤها حديثًا.