شرح الملفات الصوتية HTML
الملفات الصوتية - الوسم <audio>
في الدروس السابقة، قمنا بتغطية كيفية هيكلة المستندات (<div>)، وإضافة المحتوى المرئي الثابت (<img>)، وإنشاء الجداول (<table>)، وجمع مدخلات المستخدم (<form>). لقد قمنا ببناء صفحات "صامتة" إلى حد كبير.
هذا الدرس ينقلنا إلى عالم "الوسائط المتعددة" (Multimedia). قبل ظهور معيار HTML5، كان تضمين ملف صوتي في صفحة ويب يتطلب استخدام إضافات (Plugins) خارجية معقدة وغير آمنة (مثل Adobe Flash).
الآن، يوفر HTML5 وسماً دلالياً (Semantic) مدمجاً وقوياً يُسمى <audio>. هذا الوسم يسمح للمتصفح بـ "فهم" أن هذا العنصر هو ملف صوتي، ويوفر واجهة تحكم أصلية (Native) لتشغيله. سنتناول بالتفصيل كيفية استخدام هذا الوسم، وخصائصه، وأهمية توفير "تنسيقات" (Formats) متعددة لضمان التوافق، وكيفية توفير "محتوى احتياطي" (Fallback) للمتصفحات القديمة.
ما هو الوسم <audio>؟ (حاوية أم فارغ؟)
الوسم <audio> هو وسم دلالي (Semantic) من HTML5 يُستخدم لتضمين محتوى صوتي في المستند.
من الأخطاء الشائعة الظن بأنه وسم "فارغ" (Empty Tag) مثل <img>. هذا غير صحيح.
الوسم <audio> هو "وسم حاوٍ" (Container Tag) مزدوج. أي أنه يتطلب وسم فتح <audio> ووسم إغلاق </audio>.
لماذا هو حاوية؟
لسببين جوهريين سنتناولهما بالتفصيل:
- لتوفير "مصادر" (Sources) متعددة: للسماح للمتصفح باختيار التنسيق (Format) الذي يدعمه (مثل MP3 أو Ogg).
- لتوفير "محتوى احتياطي" (Fallback): لعرض رسالة (أو رابط تحميل) للمستخدمين الذين يستخدمون متصفحات قديمة جداً لا تدعم وسم
<audio>.
الخاصية الإلزامية للمستخدم: controls
إذا قمت بوضع وسم <audio> في صفحتك، فلن يظهر أي شيء للمستخدم. سيكون العنصر "خفياً" في الصفحة، على الرغم من أنه قد يتم تحميله في الخلفية.
لجعل مشغل الصوت "مرئياً" وتفاعلياً، يجب علينا إضافة الخاصية controls.
controls هي "خاصية منطقية" (Boolean Attribute). هذا يعني أنها لا تحتاج إلى قيمة (مثل controls="true"). مجرد "وجود" الكلمة controls كافٍ لتفعيلها.
عند إضافتها، يطلب المتصفح إظهار واجهة التحكم الافتراضية الخاصة به، والتي تتضمن عادةً:
- زر تشغيل/إيقاف مؤقت (Play/Pause)
- شريط التقدم (Progress Bar / Scrubber)
- عرض الوقت (Current Time / Duration)
- التحكم في مستوى الصوت (Volume) وزر كتم الصوت (Mute)
ملاحظة: شكل هذه الضوابط "يختلف" تماماً بين المتصفحات (مثل Chrome و Firefox و Safari).
مثال (1): أبسط طريقة لإدراج ملف صوتي (src)
الطريقة الأبسط (والأقل احترافية) هي استخدام الخاصية src (Source) مباشرة على وسم <audio>، تماماً كما نفعل مع <img>.
هنا، نحدد "مساراً واحداً" لملف الصوت، ونضيف controls لإظهار المشغل.
src و controls
<body>
<h2>مقطع صوتي تجريبي</h2>
<p>استمع إلى هذا المقطع الصوتي باستخدام المشغل الافتراضي للمتصفح:</p>
<audio
src="audio/file_example.mp3"
controls
>
</audio>
</body>
النتيجة المتوقعة:
سيظهر مشغل الصوت القياسي للمتصفح، وسيكون جاهزاً لتشغيل ملف "file_example.mp3".
لماذا هذه الطريقة "غير احترافية"؟
لأنها تفترض أن "جميع" المتصفحات تدعم تنسيق .mp3. هذا صحيح "الآن" بشكل كبير، ولكن في الماضي لم يكن كذلك، والاعتماد على تنسيق واحد فقط لا يزال ممارسة غير آمنة تماماً لضمان التوافقية الكاملة.
المشكلة: معضلة تنسيقات الصوت (Formats)
كما هو الحال مع الصور (JPG, PNG, WebP)، يأتي الصوت بتنسيقات (أو "ترميزات" Codecs) مختلفة. لا يوجد تنسيق واحد "يحكم الجميع" وتدعمه جميع المتصفحات تاريخياً.
التنسيقات الرئيسية التي تهم مطور الويب هي:
- MPEG-3 (MP3):
- **الوصف:** التنسيق الأكثر شهرة وانتشاراً. جودة جيدة وحجم مضغوط.
- **الدعم:** مدعوم الآن في جميع المتصفحات الحديثة (Chrome, Firefox, Safari, Edge).
- **المشكلة (تاريخياً):** كان محمياً ببراءات اختراع، مما جعل بعض المتصفحات (مثل Firefox قديماً) تتجنب دعمه افتراضياً وتفضل البدائل مفتوحة المصدر.
- Ogg Vorbis (.ogg):
- **الوصف:** تنسيق مفتوح المصدر (Open-source) ومجاني بالكامل. جودة ممتازة.
- **الدعم:** مدعوم بقوة في Firefox و Chrome.
- **المشكلة:** لم يكن مدعوماً (تاريخياً) في متصفح Safari (الذي يسيطر على أجهزة Apple).
- WAV (.wav):
- **الوصف:** تنسيق "غير مضغوط" (Uncompressed). جودة صوت أصلية ممتازة.
- **الدعم:** مدعوم جيداً.
- **المشكلة:** حجم الملف "ضخم جداً" (عشرات الميجابايت لدقائق معدودة). لا يُستخدم أبداً لبث الموسيقى أو البودكاست على الويب، بل فقط للمؤثرات الصوتية القصيرة جداً في الألعاب.
الخلاصة: لضمان عمل الصوت على "كل" المتصفحات (الحديثة والقديمة نسبياً)، كان الحل هو توفير الملف "مرتين": مرة بتنسيق .mp3 (لـ Safari و Chrome) ومرة بتنسيق .ogg (لـ Firefox).
الحل الاحترافي: الوسم <source>
هنا يأتي دور كون <audio> وسماً "حاوياً". بدلاً من استخدام الخاصية src على الوسم <audio> نفسه، نقوم بحذفها، ونضع بداخل <audio> عدة وسوم <source>.
الوسم <source> هو وسم "فارغ" (Empty Tag) ويتطلب خاصيتين:
src: مسار ملف الصوت (مثل"audio.mp3").type: نوع "MIME Type" للملف. هذا "يساعد" المتصفح على تحديد ما إذا كان يدعم الملف "بسرعة" دون الحاجة لتنزيله أولاً.
أنواع MIME الشائعة:
- لـ .mp3:
type="audio/mpeg" - لـ .ogg:
type="audio/ogg" - لـ .wav:
type="audio/wav"
كيف يعمل المتصفح؟
سيقرأ المتصفح وسوم <source> بالترتيب (من أعلى لأسفل). سيفحص الأول: "هل أدعم audio/mpeg؟". إذا كانت الإجابة "نعم"، سيقوم بتحميل file.mp3 "ويتجاهل" جميع وسوم <source> الأخرى.
إذا كانت الإجابة "لا"، سيقفز إلى الوسم الثاني: "هل أدعم audio/ogg؟". إذا كانت الإجابة "نعم"، سيقوم بتحميل file.ogg.
مثال (2): الاستخدام الصحيح (<source> المتعدد)
هذا هو "النمط القياسي" (Standard Pattern) لتضمين الصوت لضمان أقصى توافقية.
<source> للتوافقية
<body>
<h2>بودكاست (توافقية كاملة)</h2>
<audio controls>
<!-- المتصفح سيحاول تشغيل .mp3 أولاً -->
<source src="podcasts/episode-01.mp3" type="audio/mpeg">
<!-- إذا فشل (مثل Firefox قديم)، سيحاول تشغيل .ogg -->
<source src="podcasts/episode-01.ogg" type="audio/ogg">
</audio>
</body>
المحتوى الاحتياطي (Fallback Content)
الآن نأتي للسبب الثاني لكون <audio> وسماً حاوياً. ماذا لو كان المستخدم يستخدم متصفحاً قديماً جداً (مثل Internet Explorer 8، الذي تم إصداره قبل HTML5)؟
هذا المتصفح لا "يفهم" معنى <audio> أو <source>. لذلك، سيقوم "بتجاهل" هذه الوسوم تماماً.
ولكنه "لن يتجاهل" أي نص أو وسوم HTML عادية (مثل <p> أو <a>) نضعها "داخل" <audio> (بعد وسوم <source>).
هذا يُسمى "المحتوى الاحتياطي". المتصفحات الحديثة ستعرض مشغل الصوت وتتجاهل هذا المحتوى. المتصفحات القديمة ستتجاهل مشغل الصوت وتعرض هذا المحتوى.
أفضل ممارسة هي وضع رسالة للمستخدم تخبره أن متصفحه قديم، وتوفر له "رابطاً مباشراً" (<a>) لتحميل ملف الصوت.
مثال (3): البنية المتكاملة (<source> + Fallback)
هذا هو المثال "المثالي" (Bulletproof) لتضمين الصوت في HTML5.
<body>
<h2>مقطع صوتي (بأقصى توافقية)</h2>
<audio controls>
<source src="audio/track.mp3" type="audio/mpeg">
<source src="audio/track.ogg" type="audio/ogg">
<!-- المحتوى الاحتياطي يبدأ هنا -->
<p>
متصفحك لا يدعم وسم <code><audio></code> الحديث.
<br>
يمكنك تحميل المقطع الصوتي مباشرة من:
<a href="audio/track.mp3">اضغط هنا للتحميل (MP3)</a>
</p>
<!-- نهاية المحتوى الاحتياطي -->
</audio>
</body>
الخصائص المنطقية: autoplay (ومشكلاته)
الآن بعد أن أتقنا البنية، لنتعرف على الخصائص (Attributes) الإضافية.
الخاصية autoplay هي خاصية "منطقية" (Boolean). إذا وُجدت، فإنها تطلب من المتصفح بدء تشغيل الصوت "تلقائياً" بمجرد تحميل الصفحة.
تحذير شديد الأهمية:
يُعد التشغيل التلقائي للصوت (خاصة مع وجود صوت مرتفع) أحد "أكثر الممارسات إزعاجاً" للمستخدمين على الويب.
لهذا السبب، "جميع" المتصفحات الحديثة (Chrome, Firefox, Safari) لديها الآن سياسات "تمنع" التشغيل التلقائي. لن تعمل autoplay في 99% من الحالات إلا إذا كان المستخدم قد تفاعل مع الموقع مسبقاً (أو إذا كان الصوت مكتوماً).
القاعدة: تجنب استخدام autoplay إلا إذا كان لديك سبب وجيه جداً، وكن مستعداً لأنه لن يعمل غالباً.
الخصائص المنطقية: loop و muted
هاتان خاصيتان منطقيتان (Boolean) مفيدتان:
loop(التكرار): إذا وُجدت هذه الخاصية، سيقوم المتصفح بإعادة تشغيل المقطع الصوتي تلقائياً من البداية "كلما انتهى". مفيدة للموسيقى الخلفية أو المؤثرات الصوتية المتكررة.muted(كتم الصوت): إذا وُجدت هذه الخاصية، سيبدأ مشغل الصوت في حالة "كتم الصوت" (Volume at 0). سيحتاج المستخدم إلى النقر على زر الصوت لتمكينه.
الاستثناء الوحيد لـ autoplay:
غالباً ما تسمح المتصفحات بالتشغيل التلقائي (autoplay) "فقط" إذا كان مصحوباً بالخاصية muted. هذا مفيد إذا كنت تريد تشغيل موسيقى خلفية يجب على المستخدم اختيار سماعها بنفسه.
مثال (4): تشغيل صوت في الخلفية (autoplay + muted)
هذا المثال يوضح كيفية محاولة تشغيل مقطع صوتي تلقائياً (ولكنه مكتوم) وتكراره. لاحظ أننا "أزلنا" controls لجعل المشغل خفياً تماماً (موسيقى خلفية).
<body>
<h1>صفحة ذات موسيقى خلفية هادئة</h1>
<!--
هذا المشغل "خفي" (بدون controls)
وسيحاول البدء تلقائياً (autoplay)
ولكنه سيعمل فقط لأنه "مكتوم" (muted)
وسيكرر (loop)
-->
<audio autoplay muted loop>
<source src="audio/background-music.mp3" type="audio/mpeg">
<source src="audio/background-music.ogg" type="audio/ogg">
</audio>
<p>(ملاحظة: لإلغاء كتم الصوت، ستحتاج إلى إضافة زر مخصص باستخدام JavaScript)</p>
</body>
خاصية التحميل المسبق: preload
هذه خاصية "تحسين أداء" (Optimization) اختيارية. إنها تعطي "تلميحاً" (Hint) للمتصفح حول كيفية التعامل مع تحميل ملف الصوت "قبل" أن ينقر المستخدم على زر التشغيل.
تقبل هذه الخاصية ثلاث قيم:
preload="auto"(الافتراضي): يترك القرار للمتصفح. قد يقرر المتصفح تحميل "الملف الصوتي بالكامل" (حتى لو لم يشغله المستخدم)، مما يضمن بدء التشغيل فوراً عند النقر، ولكنه "يهدر" بيانات المستخدم (Bandwidth) إذا لم يتم تشغيل المقطع.preload="metadata"(الموصى به): يخبر المتصفح بتحميل "البيانات الوصفية فقط". هذا يعني تحميل معلومات مثل "مدة المقطع" (Duration)، واسم المقطع، وما إلى ذلك، دون تحميل الملف الصوتي نفسه. هذا سريع جداً، ويوفر بيانات المستخدم، ويجعل المشغل يبدو جاهزاً (يعرض 03:45 كمدة).preload="none"(الأخف): يخبر المتصفح "بعدم تحميل أي شيء" (لا بيانات وصفية ولا صوت) إلا إذا نقر المستخدم على "تشغيل". هذا هو الخيار الأفضل "لتوفير البيانات" إذا كانت الصفحة تحتوي على عشرات المقاطع الصوتية، ولكن المشغل قد يظهر بمدة 00:00 وقد يكون هناك "تأخير" (Delay) عند النقر على "تشغيل" بينما يبدأ التحميل.
مثال (5): استخدام preload="metadata" للأداء
هذا هو الاستخدام الشائع لصفحات البودكاست أو الموسيقى لتحقيق التوازن بين الأداء وتوفير البيانات.
<body>
<h2>قائمة الحلقات (أداء محسن)</h2>
<p>الحلقة 1:</p>
<audio controls preload="metadata">
<source src="podcasts/ep1.mp3" type="audio/mpeg">
<p><a href="podcasts/ep1.mp3">تحميل الحلقة 1</a></p>
</audio>
<p>الحلقة 2:</p>
<audio controls preload="metadata">
<source src="podcasts/ep2.mp3" type="audio/mpeg">
<p><a href="podcasts/ep2.mp3">تحميل الحلقة 2</a></p>
</audio>
</body>
ملاحظة هامة حول التنسيق (CSS)
كما ذكرنا، فإن واجهة التحكم controls الافتراضية "تختلف" بشكل كبير بين المتصفحات (شكلها في Chrome يختلف عن Safari).
في دروس CSS المتقدمة جداً، ستتعلمون أن المطورين المحترفين "نادراً" ما يستخدمون controls الافتراضية.
بدلاً من ذلك، يقومون بما يلي (وهو أمر "لن" نشرحه الآن، ولكنه للعلم):
- إدراج وسم
<audio>"بدون" خاصيةcontrols(لجعله خفياً). - بناء "واجهة تحكم مخصصة" باستخدام وسوم HTML عادية (مثل
<button>لـ "تشغيل" و<div>لـ "شريط التقدم"). - تطبيق تنسيق CSS على هذه الأزرار لجعلها تبدو "متطابقة" في جميع المتصفحات.
- استخدام "JavaScript" لربط هذه الأزرار المخصصة بوظائف
<audio>الخفية (مثلaudio.play()وaudio.pause()).
الوسم <audio> الذي تعلمناه اليوم هو "المحرك" (Engine) الذي يعمل في الخلفية، بينما CSS و JavaScript هما اللذان يبنيان "الهيكل" الخارجي الجميل للمشغل المخصص.
(ملخص الدرس):
1. استخدم <audio>...</audio> لتضمين الصوت (إنه "حاوية").
2. الخاصية controls "إلزامية" لإظهار مشغل الصوت للمستخدم.
3. لا تستخدم src مباشرة، بل استخدم وسوم <source> متعددة (.mp3 و .ogg) لضمان "التوافقية" القصوى.
4. أضف "محتوى احتياطي" (Fallback) (مثل نص ورابط تحميل) داخل <audio> للمتصفحات القديمة جداً.
5. autoplay (التشغيل التلقائي) "مكروه" و "محظور" من قبل المتصفحات إلا إذا كان مصحوباً بـ muted (كتم الصوت).
6. loop (التكرار) و muted (كتم) هما خاصيتان منطقيتان مفيدتان.
7. preload="metadata" هي القيمة الأفضل للأداء وتوفير البيانات.