ضغط الصوتيات وتحويلها بنظام GST
مع التركيز على Vorbis و Speex
المقدمة
سنتحدث في هذه المقالة عن ملفات الصوت وطريقة تحويلها وضغطها والتحكم في جودتها. وسنمارس ألاعيبنا هذه عبر هيكلية
GStreamer
المتوفرة في أغلب توزيعات نظام التشغيل غنو/لينكس GNU/Linux الحديثة،
وذلك لأنها غنية وشاملة مع العلم أنه توفر الكثر من البرامج الأخرى الرسومية السهلة مثل Audacity و Sweep وغيرها.
إن برنامج Audacity يحتوي على الكثير من الخيارات الرائعة والمؤثرات.
ربما تفضل أن تشاهد هذا الفيلم الذي يريك بعض استعمالات Audacity
من هنا.
عليك النتباه للأداة المستخدمة فهناك أداة التحديد التي تشبه المؤشر أو حرف I وهناك أداة envope مط المستوى وهناك أداة الإزاحة الزمنية وهناك الأداة المتعددة رمز النجمة وهي التي أستعملها بشكل تلقائي.
مثلاً يمكنك إزالة الضجيج وذلك بتحديد ثانيتان من الصمت (فقط الضجيج المراد إزالته) ثم النقر على noise removal من قائمة effects ثم اختيار تحليل الضجيج get noise profile وبعد الانتهاء عليك تحديد الصوت كله CTRL+A ثم مرة أخرى على خيار noise removal ولكن هذه المرة ليس للتحليل بل للإزالة وذلك بالنقر على OK.
ملاحظة لا تعمل أغلب الخيارات في حالة التشغيل أو حالة التوقف المؤقت pause اضغط على زر stop حتى تفعل كل الخيارات.
مقدمة عن تمثيل الصوت
الصوت عبارة عن موجات ميكانيكية (تضاغط وتخلخل) تنتقل في وسط مادي كالهواء (ولا تنتقل في الفراغ)
وكأي موجة فإن لها سعة (مقدار الإزاحة القصوى) وتردد (عدد الموجات الكاملة في الثانية).
التمثيل الرقمي للصوت يعتمد على ما يسمى sampling، أي أخذ عدد محدد من العيّنات في فترات منتظمة من المايكروفون (الذي يخرج منه تيار كهربائي يتذبذب مع تذبذب الهواء بسبب شدة الصوت). العينة الواحدة فد تكون بايت (أي بت) مما يعطينا رقماً بين 0-255
دون إشارة أو بين سالب 128 و موجب 127 إذا كان بإشارة signed
(وأحياناً يستخدم بتات أكثر من ذلك مثلاً 16-بت التي تعطينا أرقماً حتى عشرات الآلاف)
والمقصود من الرقم هنا لا يعني شيء بل يعني مقدار الشدة ففي الأولى تمثل أكبر شدة للصوت بالرقم 255.
وهناك تمثيل خاص بالاستديوهات المتقدمة يعتمد الأرقام النسبية (الكسور) وتكون القيمة بين الصفر والواحد أو بين سالب واحد وموجب واحد تكون فيه أعلى شدة ممثلة بالرقم 1.0 وهكذا. عدد العينات في الثانية يسمى sampling rate ويقاس بعدد البتات في الثانية.
وإذا كنت تصمم برنامجك الخاص عليك الانتباه إلى أجناس الحاسبات المختلفة endianness (أهو الطرف الكبير أولاً أم الطرف الصغير أولاً)
حيث تحدث مشاكل عند أخذ ملفات سجلت على جهاز من النوع الأول ثم ينقل إلى جهاز من النوع الثاني ما لم تأخذ طريقة ترتيب البايتات داخل الكلمة (تجاهل هذه الملاحظة إذا كانت تسبب لك حكة).
عند تسجيل ملف صوتي عليك مراعات أن لا تتجاوز شدة الصوت الحد الأعلى الذي يتمكن الحاسوب من تمثيله ولا حتى يقترب منه (وذلك بمشاهدة التمثيل البصري على شكل أعمدة والذي يوضع له أحياناً جزء أحمر في الأعلى)
كما يجب أن لا يكون خافتاً جداً بل يجب أن يكون في الوسط. كذلك يجب تجنب تأثر التغذية الراجعة feedback effect وهو بأن تكون تتحدث في مايكروفون مواجه لسماعات خارجية تعيد إخراج صوتك ليدخل مرة أخرى في المايكروفون ثم يخرج مضخماً وهكذا عدة مرات فيتداخل مع الصوت النقي الذي تريد تسجيه. وحل هذه المشكلة يكون بكتم صوت السماعة والاكتفاء بالتمثيل البصري على الشاشة أو باستعمال سماعة رأس (وفي الاستديوهات يستخدمون الزجاج لعزل صوت البيئة المحيطة).
وتوفر الكثير من بطاقات الصوت في الحاسوب تضخيم ذبذبات المايكروفون
Mic Boost (+20db)
لكنها لا تكون ظاهرة في خيارات المازج الصوتي (المتحكم في شدة الصوت) إلا بفتح التفضيلات وطلب إظهار هذا الخيار ثم تفعيله.
حجم ملف الصوت الخام (مجرد حفظ للعيّنات كيفما اتفق) هو ناتج ضرب معدل العينات بالثانية sampling rate (بعد تحويله من بت إلى بايت) في عدد الثواني.
فللتوفير في حجم الملف يمكن التقليل من معدل العيّنات لكن ذلك يقلل من الترددات التي يمكن تمثيلها
فإذا أردنا عمل موجة مستطيلة ساذجة بتردد 1000 هيرتز فإننا نحتاج على الأقل لعمل 1000 نبضة موجبة في الثانية بسعة لنقل +64 (مثلاً) يفصل بينها 1000 نبضة -64 (مثلاً) أي أننا على الأقل سنحتاج إلى أخذ 2000 عينة في الثانية كي تظهر فيها هذه الموجة.
إن القرص المدمج غير المضغوط Audio CD يمثل الصوت فيه ب 44100 عينة في الثانية مما يعني أنه يستحيل عليه تمثيل ترددات تفوق 44100 هيرتز. لكن الأذن البشرية بالكاد تسمع ترددات فوق عشرين ألف هيرتز. عند حفظ ملفات الصوت بصيغة WAV غير المضغوطة (PCM)
بعد تقليل معدل العيّنات إلى 8000 هيرتز مثلاً لتقليل الحجم إلى الخمس تقريباً (كما يفعل الكثرون بملفات الأجهزة الخلوية) فإننا نهمل الكثير من الترددات العالية الجميلة وهم لا يلاحظون الفرق لسببين أحدهما أن بطاقة الصوت الرديئة (داخل الخلوي مثلاً) أو السماعات الرديئة أو كبر السن!
أما الترددات المنخفضة (دون 300 هيرتز) فإنها تمثّل جيداً لكن المايكروفون غير الحساس قد لا يلتقطها كما أنها بحاجة إلا جهاز إخراج خاص إلى جانب السماعات وهو نظام Base system (قد يعرب صوت القرار أو ما شابه) يكون عبارة عن صندوق خشبي كبير به ثقب واسع
ويحرك الهواء بشدة ملحوظة (تحس بدفها على يدك وتراها أثرها على القماش المجاور). هذه الترددات المنخفضة تأتي من الدف أو الطبول أو من الضربات والفرقعات النارية ...إلخ وهي تعطي واقعية في التسجيل.
في أقراص الصوتيات المدمجة Audio CD غالباً ما تخزن العينات بصورتها خام بمعدل 44100 Hz وقناتين (يمنى ويسرى أي ستيريو) وكل عينة عبارة عن 16-بت. تغلف مثل هذه المعلومات إلى جانب اسم الفنان والعنوان ...إلخ على شكل مسارات Tracks بطريقة مختلفة عن طريقة ISO 9660 المستخدمة في الحواسيب ولكن بطريقة خاصة صممت من أجل أجهزة تشغيل الأقراص المدمجة CD Players على الرغم من أن نظام ويندوز يظهر تلك البيانات على شكل ملفات من نوع CDDA إلا أنها ليست كذلك، كما أن واجهة KDE تذهب أبعد من ذلك فهي قد تظهر تلك الملفات وتظهرها أيضاً على شكل ملفات WAV و MP3 و OGG إلا أنه فعلياً لا يوجد أي من تلك الملفات ببساطة لأنه لا يوجد نظام ملفات بل مجرد مسارات وما يظهر هو مجرد محاكاة.
أما في ملفات WAV و ملفات OGG هي حاويات Container Format أي هيئة صممت لتحتوي الوسائط المتعددة بغط النظر عن طريقة تمثيلها.
طرق التمثيل تسمى CODEC أي Coding/Decoding طرق الترميز وفك الترميز. فقد تجد ملف WAV البيانات داخله ممثلة بخوارزمية MPEG-1 Layer 3 أو MP3 للاختصار (نعم لدي مثل هذه الملفات).
مقدمة عن ضغط الصوت
إن طريقة التمثيل الأفضل CODEC هي التي أعلى جودة بأقل حجم ممكن ولهذا يسميها البعض طرق ضغط.
إن هناك صنفين من طرق ضغط الصوت:
ضغط غير فاقد للجودة مثل FLAC وضغط فاقد للجودة مثل الكثير من الطرق المعروفة.
النوع الأول تكون الموجات الناتجة من مطابقة تماماً للموجات الداخلة لكن النقص في حجم الملف يأتي من استخدام تمثيل رياضي لها
يحتاج عدداً أقل من البتات. فإذا كانت هناك موجة قادمة من الفضاء وتريد العمل على تحليلها دون فقد أي شيء أو إذا كانت هذه الموجة يستقبلها جهاز حساس ...إلخ من الاحتمالات الغريبة الأخرى فإن هذه الطريقة في ضغط الملف الصوتي لا تؤثر إطلاقاً على المخرجات.
يمكن الاستفادة منها عند اختبار طرق الضغط الأخرى أو دراسة الموجات وغيرها من المواضيع الهندسية.
أما الضغط الفاقد للجودة، فإنه الشائع والأكثر فائدة ففي النهاية لا نريد الحصول على موجات مطابقة نحن نريد صوتاً جميلاً
إلى الأذن البشرية لا موجات. الضغط الجيد هو الذي يفقد التفاصيل التي لا تريد الأذن سماعها أو لا تستطيع سماعها.
الضغط الجيد هو الذي لا يقلل مدى الموجات المرمزة فيتمكن من تمثيل الموجات ذات التردد العالي والمتوسط والمنخفض.
أما ما تحدثنا عنه سابقاً من حفط الملف بتقليل التردد الأعلى ما هو إلا إهمال المدخلات ولا يعد ترميزاً.
عند مقارنة طرق الضغط علينا مقارنتها عند نفس التردد الأعلى. إن أول الطرق وأبسطها هو استخدام عدد أقل من من البتات في تمثيل النبضة الواحدة في العينة فبدلاً من تمثيل القيمة من 0 إلى 255 بثمانية بتات فإنهم يستخدمون 3 بتات (مثلاً) والتي تعطي الأرقام من 0 إلى 7
لكنهم يجعلونها لوغريتمية (أي أن هناك قفزات) بعلاقة كالتالية
y(x)=2(x+1) - 1
إذا لم تفهمها اكتب الأمر التالي (بالخط الغامق) وهو برنامج من سطر واحد بلغة بايثون يظهر لك جدول التحويل.
bash$ python -c 'for i in xrange(8): print i,(1<<(i+1))-1'
0 1
1 3
2 7
3 15
4 31
5 63
6 127
7 255
من الجدول نلاحظ أن كل العينات فوق 127 تمثل بالرقم 7 وكل ما دونها وفوق 63 يمثل بالرقم 6 وهكذا.
هذه الطريقة تستغل نقصان حساسية الأذن مع ازدياد السعة فالأرقام الصغيرة متقاربة والقفزات تزداد لاحقاً.
هذه الطريقة تختصر خمس أثمان الملف أي حوالي 62.5% (توفر أكثر من نصف الحجم كما أنها إذا استعملت مع تقليل معدل العينة كما يفعل بالأجهزة الخلوية فإنها قد توفر 90% من حجم الملف!)
تلك أكثر الطرق سذاجة. أما الطرق المتطورة مثل MPEG (مثل ملفات MP3) وملفات Real Media والطرق الحرة المقابلة Ogg/Vorbis و Ogg/Speex فإنها تستخدم استراتيجية مختلفة.
تقوم Vorbis و MP3 على خوارزمية MDCT وهي تختصار للعبارة
Modified Discrete Cosine Transform
أي اقتران جيب التمام المتقطع المعدل (أي المعدل عن Fourier Transformation وهي التي تمثل أي إشارة على شكل مجموع من موجات جيوب التمام المتخامدة)
أما Speex تستخدم خوارزمية تسمى CELP وهي اختصار للعبارة Code Excited Linear Prediction
أي التوقع الخطي للكود المميز وهي تقوم على تمثيل العينة على مجموع خطي لما قبلها في إطار زمني معين مع تقليل الخطأ بشكل موزون (أي التركيز على أن يكون الفارق أقل لما تكون له الأذن أكثر حساسية).
وعلى عكس Vorbis فإن Speex مصممة خصيصاً للكلام لا للموسيقى.
ملفات Real Media هي مجرد حاوية للعديد من طرق التمثيل لكن ما يميزها أنها تسمح بخاصية السيالات Streaming أي
ليس ضرورياً أن يتم تحميل الملف بالكامل من أجل الاستماع إليه فيمكن الاستماع إليه أثناء تحميل جزء منه
وهذا يعني أن لا تخزن البيانات المتزامنة بشكل متسلسل في الملف واحدة بعد الأخرى بل على شكل وحدات صغيرة تسمى
مبرقات datagrams تحتوي على كل المعلومات المتزامنة (كالصوت والصورة والترجمة أو الصوت اليمين واليسار فلايخزن الصوت بعد الصورة وإلا فإن عليك الانتظار حتى يتم الانتهاء من تحميل كامل الصور لتبدأ بالاستماع للصوت). كما أنه يعني إمكانية المتابعة عند
حدوث تأخر في وصول بعد المبرقات والقفز عنها (مما يسمح بعمل Voice over IP أي إذا تكلم الشخص وحدث ضغط على الشبكة فإن البرنامج لن ينتظر قدوم البيانات وسيتابع الحديث بشكل متزامن).
والجدير بالذكر أن هيئة Ogg صممت هي الأخرى من أجل هذه الغاية وهذا أكثر ما يعجبني بها (مثلاً يمكنني الاستماع إلى الجزء المحول قبل الانتهاء من تحويل كامل الملف)
إن عملية التحويل يجب أن تكون دائماً من الأعلى جودة إلى الأقل. بكلمات أخرى إذا كان هناك ملف مخزن بطريقة فقدت الجودة
فإن تحويلها إلى هيئة تحافظ أكثر على الجودة من ذلك المصدر الذي لم يحفظ الجودة لن تعيد
الجودة لأنه لا يوجد طريقة لاستعادة ما لم يتم حفظه أصلاً!
كما أن التحويل باستخدام الطرق الفاقدة دائماً يزيد من الخطأ (التشويش) حتى لو كان ضمن نفس النوع ونفس الجودة
(إذا فتحت ملف MP3 بواسطة برنامج تحرير صوتي ثم قمت بأي شيء ليس له أي تأثير ثم حفظت الملف بنفس الإعدادات فإن التشويش سيزيد بسبب تراكم التقريب/الخطأ عند إعادة ترميز نفس البيانات)
أفضل مصدر للتحويل منه هو القرص الصوتي غير المضغوط Audio CD أو أي هيئة أخرى مثل ملفات WAV غير المضغوطة (قد يصل فيها حجم الدقيقة الواحدة أكثر من ميغابايت!) أو تلك المخزنة بضغط غير فاقد للجودة مثل FLAC.
أما التحويل من MP3 (أو Ogg/Vorbis) فإنه يكون حلاً عملياً غير مضمون النتائج وقد يكون مفيداً إذا كانت بجودة عالية مثلاً MP3 بمعدل 44100 Hz وبجودة حوالي 128 Kb/s تعطي نتائج جيدة عندما يكون الهدف هو تقليل الحجم على حساب الجودة التي لا يمكن الاحساس بها.
المقايضة بين الحجم والجودة
يظن الكثيرون أن الطريقة الأفضل هي الطريقة التي تعطي أقل معدل بتات bit rate (أي حجم الملف) عند نفس
معدل العينة sample rate (جودة الصوت)
وهذا نوعاً ما صحيح. إلا أن الطرق الحديثة مثل MP3 و Ogg/Vorbis و Ogg/Speex تسمح لك بأن تحدد معدل البتات الذي تريد وبالتالي تعطيك الحجم الذي تطلبه للملف عند نفس معدل العينة وهذا ظاهرياً يعني أنها تسمح لك بتحديد الحجم الذي تريد عند أي جودة تريد وهذا غير منطقي!
الصحيح هو أن sample rate ليس المقياس الوحيد للجودة في الطرق الفاقدة لأن الفقد فيها لا يكون بإهمال العينات
بل بالعبث بالعينات نفسها فإذا كانت العينة ذات المقدار 23 مثلاً قد لا تمثل لتخرج 23 بل تمثل كي تبدو وكأنها قريبة من 23.
فالطريقة الوحيدة للمقارنة (دون الاستعانة بمساعدة برامج وأدوات هندسية تحسب الخطأ المتراكم) هي الأذن البشرية.
فالجودة عند نفس معدل البيانات ونفس معدل البتات تختلف من تمثيل إلى آخر بل وحتى ضمن نفس التمثيل مثلاً هناك طريقة "متخلفة"
لتوليد ملفات MP3 دون استعمال ما هو مشمول ببراءة اختراع في MP3 باستخدام ما يشبه MP2 (لأسباب قانونية في بعض الدول)
مما يعطي ملفات MP3 أكبر مما ينبغي عند نفس الجودة! كذلك فإن برنامج التحويل إلى MP3 المسمى LAME (وهو أفضلها برأيي كما أنه حر) به 4 خوارزميات مختلفة للتعامل مع معدل البتات VBR!
وغالباً ما تعطي البرامج حجماً جيداً عندما تستخدم للهدف الذي صممت لتحقيقه. كما أن جودة المصدر الذي يتم التحويل منه أمر مهم
فإذا كنت تحول نغمة رنين خلوي من WAV مضغوط بطريقة GSM إلى MP3 ولم تحصل على ما يرضيك لا تلم MP3 لأن طريقة GSM في ملف WAV
قد تكون أنتجت فقدان وعوضته بضجيج قد لا تحس به لكنه يعقد برنامج التحويل في تمثيله مع أنك بالتأكيد لا ترغب بزيادة حجم الملف
من أجل المحافظة على الضجيج.
الطرق الحديثة تسمح لك بتحديد معدل ثابت من البتات fixed bit rate مما يعني أنك ستعلم مسبقاً حجم الملف وهذا مفيد عندما تريد إرسال البيانات (بطريقة streaming) عبر شبكة تعرف سرعتها أو بشكل أقل أهمية عندما تكون محصوراً بحجم معين للقرص.
كما أن بعضها يسمح بما يسمى تحديد متوسط عدد البتات average bit rate أو الحد الأقصى للمعدل البتات maximum bit rate مما
يعطي الحد الأعلى لمعدل البتات فلا يتجاوز حجم الملف القيمة المتوقعة بل يقل عنها بشكل يتغيّر مع تعقيد الموجة (يزيد عند الحاجة ويقل عند الحاجة).
وإن أفضل طريقة هي عدم تحديد أي من تلك المعاملات بل استخدام محرك تلقائي لاختيار المعدل المناسب بشكل متغيّر وفقط تحديد الجودة المطلوبة.
مقدمة عن هيكلية GStreamer
في السابق كانت (ولا تزال) هناك مشغلات وسائط قوية في نظام غنو/لينكس مثل Xine و Mplayer. كل منها يحتوي على إضافات خاصة به
من أجل تشغيل الأنواع المختلفة، وكل منها له هيكليته الخاصة.
وهذا قد يكون جيداً لكن هناك علة. أنه لإضافة دعم لأحد الهيئات علينا إضافتها إلى كل المشغلات.
لهذا جاءت فكرة GStreamer والذي كانت بدايته توفير هيكلية للوسائط المتعددة في غنوم GNOME لكنه الآن آخذ بشق طريقه في KDE
حيث أن مشغل الصوتيات Amarok يعتمد عليه (أو يمكن إعداده ليكون كذلك) خصوصاً بعد أن أصبح Gstreamer في Free Desktop
انظر
http://gstreamer.freedesktop.org.
يمتاز GStreamer بأنه ليس مشغل وسائط ولا مكتبة تشغيل (على عكس مكتبات Xine و MPlayer) كما أنه ليس مصرف صوتي Sink ولا خادم
ولا عفريت Daemon (برنامج يعمل في الخلفية على تلقي الإشارة من عدة جهات لتشغيلها كما Arts Daemon أو ESD)
إنه هيكلية متكاملة للوسائط يمكنها أن تستخدم في أي شيء يتعلق بالوسائط المتعددة من التشغيل إلى التحويل والتحرير مروراً بعمل المؤتمرات عن بعد والدردشة بالصوت والصورة.
هذه الهيكلية تسمح بتصميم برامج لتقوم بأي شيء يتعلق بالوسائط المتعددة دون الكثير من العناء، إذا تم إضافة دعم لفك ترميز ملفات MP3 فإنه يمكنك مثلاً تحويلها إلى هيئات أخرى أو مثلاً إذا تم إضافة دعم لقراءة نوع من ملفات الفيديو يمكن مثلاً استخراج الصوت منها لوحده وقص أجزاء منه. أو إذا ما تم إضافة طريقة لترميز ملفات فيديو معينة يمكن الاستفادة من ذلك لطباعة الترجمة عليها ...إلخ.
وعلى عكس كل التقنيات السابقة فإن GStreamer توفر أكبر عمومية دون التقليل من الأداء فهي
تستخدم كل خوارزميات التحسين الممكنة مثل المشاركة في الذاكرة ..إلخ.
يتوفر الكثير من البرامج التي تستفيد من هذه الهيكلية في عمل الكثير من الأشياء منها مثلاً المشغل Totem ومنها مثلاً sound-juicer الذي يستخرج الملفات الصوتية من أقراص الصوتيات ويخزنها على أي شكل آخر يدعمه GST. وهناك برامج لتصوير الشاشة وحفظها على شكل ملف فيديو.
كما يأتي نظام GST بأداة اسمها gst-launch (وربما مع رقم الإصدارة مثلا
gst-launch-0.10
كما الحال عندي)
وتقول الوثائق أن هذه الأداة ليست هدفاً بحد ذاتها بل إن المقصود منها تدريب المطورين.
وحيث أني هنا أقدم شرحاً متقدماً لهذا سأستخدم هذه الأداة وأبين طريقة عمل هيكلية وخفاياها.
إذا كنت تستخدم نظام Ubuntu فقد تفضل إضافة الحزم التي تضيف دعم بعض الأنواع التي لا يمكن توزيع الملفات الداعمة لها في بعض الدول
مثل ffmpeg
(التي تعطيك طرق فتح أكثر من 90 نوع من الملفات تشمل AVI و MPEG و ASE ... وطرق تخزين أكثر من 40 نوع مثل MPEG و DivX و MPEG4 و DV ...إلخ)
كما قد تحب تركيب حزمة gstreamer0.10-plugin-ugly (لتشغيل ملفات MP3 وأشباهها من MPEG) وحزمة gstreamer0.10-plugin-ugly-multiverse (التي تحتوي على دعم لمكتبة برنامج Lame الذي يخزن ملفات MP3).
وبالتأكيد تحب زيارة موقع
www.medibuntu.org
وإضافته إلى مستودعات أوبنتو لتتمكن من تشغيل الأنواع المختلفة وتحويلها.
كما قد تحب تركيب حزمة PitfDLL التي تسمح بتشغيل الإضافات الخاصة بنظام ويندوز
بوضع ملفات DLL في المجلد
/usr/lib/codecs/win32/
(والذي يجب أن يوضع له وصلة في /usr/lib/win32/ تشير إليه كي يراه GStreamer)
هذه المكتبة تجعل GStreamer قادراً على فتح وتصدير جميع الأنواع التي يستطيعها أي برنامج قياسي في ويندوز
(يمكن الحصول على ملفات DLL من موقع
www1.mplayerhq.hu/homepage/design7/codecs.html
أو بإضافة http://apt.cerkinfo.be/ إلى مصادر حزم APT)
والجدير بالذكر أن هذه المكتبة طورت بالأصل من أجل MPlayer ثم أدخلت إلى Xine و GStreamer للمزيد من المعلومات انظر
http://sourceforge.net/projects/pitfdll/ .
كما أن GStreamer لا يتعرف على تلك الملفات إلى بعد شطب ملف كما يلي
rm ~/.gstreamer-*/registry*.xml
وكي تتأكد منه أخذها اكتب
gst-inspect-0.10 pitfdll
استخدام gst-launch
كما يعمل المستخدم المتقدم لسطر الأوامر في يونكس على وصل البرامج بأنابيب مثل هذا
|
لوصل مخرجات أمر لتصبح مدخلات لآخر.
تماماً كما في خطوط الإنتاج في المصانع حيث تكون كل وحدة مسؤولة عن أمر معين وتوضع تلك الوحدات على خط pipeline
تقوم كل وحدة بدورها ثم تمرر الناتج لما بعدها (تثبيل هيكل سيارة ثم دهان ثم وضع عجلات ...إلخ).
وهكذا فإن خط الإنتاج في GST يبداً بمصدر source لينتهي في مصرف sink.
المصدر غالباً ما يكون ملف filesrc وربما يكون ملف وهمي أو في شبكة كما يراها GNOME عبر gnome-vfs أو ربما يكون منفذ ليتم استقبال المبرقات منه وفق بروتوكول ما وعند التسجيل ربما يكون لاقط الصوت (المايكروفون) من بطاقة الصوت عبر تعريف ALSA أي alsasrc أو عبر OSS فيكون osssrc. المصرف في حالة التشغيل سيكون السماعات عبر بطاقة الصوت بتعريف ALSA أي alsasink أو عبر OSS أي osssrc
(ويمكن أن نرسل الصوت أو عفريد غنوم esd بواسطة esdsink إلى عفريت KDE أي artsd) ويمكننا إرسالها
وبين المصدر والمصرف تمر السيالات (ومن هنا جاء الاسم stream) بوحدات تهدف إلى تحويل وفلترة والتحكم والقياس ...إلخ.
كل وحدة يكون لها مدخل على الأقل ومخرج على الأقل (باستثناء الأطراف) ولها إمكانيات محددة مثلاً ما هي الهيئات التي
تستطيع التعامل معها.
ويجب الانتباه إلى أن الأنبوب هو علامة التعجب "!" وليس الأنبوب التقليدي "|" كي لا يأخذه مفسر سطر الأوامر BASH.
لابد أنك مللت تلك التفاصيل وتريد أن ترى شيئاً يعمل. لنفترض أن لدينا ملف صوت Ogg/Vorbis اسمه file.ogg ونريد الاستماع إليه
إليك الطريقة (اكتب النص الغامق بعد
bash$)
bash$ gst-launch filesrc location=file.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! osssink
تبدو طويلة ومعقدة إلا أنها بسيطة جداً.
الوحدة filesrc تحدد بداية السيلات من ملف وفي النهاية تنتهي السيالات في بطاقة الصوت عبر تعريف OSS بواسطة الوحدة osssink.
وكما نلاحظ قد تأخذ بعض الوحدات معاملات كما أعطينا موقع الملف بواسطة location في وحدة المصدر من ملف filesrc.
الوحدة oggdemux تعمل على فرز ملف لهيئة OGG (الذي قد يحتوي صوت وصورة وترجمة ...إلخ) وفي حالتنا فإنه لا يحتوي سوى على صوت
ستم تمرير الصوت المضغوط بطريقة vorbis إلى الوحدة vorbisdec أي decoder لفك الترميز وتحويله
من سيالات audio/x-vorbis إلى سيالات خام غير مضغوطة audio/x-raw-float
وتعمل وحدة audioconvert على تحويها إلى audio/x-raw-int خام بأعداد صحيحة (لأن بطاقات الصوت قد لا تعرف كيف تتعامل مع أعداد نسبية) وتعمل audioresample على تحويل معدل العينة إلى معدل عينة تدعمه بطاقة الصوت (إذا كان معدل العينة أقل أو أكثر مما تستطيع بطاقة الصوت تحمله) هذا إن لزم الأمر فقط. وبعد كل هذا تصل السيلات التي أصبحت بهيئة audio/x-raw-int التي تفهمها بطاقة الصوت وتسمع الوصت عبر مصرف الصوت osssink.
لاحظ أن الحاويات يجب فرزها demux (مثلا عبر wavparse أو avidemux أو mpegdemux أو rmdemux لملفات WAV و AVI و MPEG مثل MP3 و Real على الترتيب) وطرق الترميز يجب فكها decode (مثلاً عبر mad لملفات MP3 و speexdec لملفات spx وهكذا)
وهذه القصة الطويلة يمكن جعلها أبسط لكني كتبتها كاملة من أجل التوضيح، حيث يمكن استعمال بعض الاتمتة كما في الأمر التالي
bash$ gst-launch filesrc location=file.ogg ! decodebin ! audioconvert ! osssink
حيث تعمل الوحدة decodebin على فرز وفك ترميز الملف تلقائياً (تجد تلقائياً الوحدات المناسبة لفرز الملف أو السيالات ثم لفك ترميز ما تم فرزه)
وتصلح لأي هيئة يدعمها GST. كما أني استغنيت عن audioresample لأني أظن أن بطاقة الصوت لدي تدعم معدل عينات 44100 Hz
(تحتاج إلى هذه الوحدة عند استعمال معدلات غير قياسية فقط).
إنّ تعلم GST ليس صعباً كل ما عليك هو استعمال gst-inspect
جرب الأوامر التالية:
bash$ gst-inspect | grep -i 'mp3'
bash$ gst-inspect | grep -i 'vorbis'
bash$ gst-inspect | grep -i 'sink'
bash$ gst-inspect | less
bash$ gst-inspect osssink | less
bash$ gst-inspect queue | less
bash$ gst-inspect lame | less
bash$ gst-inspect mad | less
طريقة التسجيل المباشر
إن التسجيل مباشرة أفضل من التحويل (في الغالب إذا استعملت اللاقط المناسب والأسلاك المناسبة المعزولة جيداً والغرفة المعزولة جيداُ)
قبل البدء بالتسجيل أذكرك بما ذكرته سابقاً عن تشويش التغذية الراجعة إما أن تستعمل سماعات رأس أو تغلق السماعات العادية
كما أذكر بأن مازج الصوت sound mixer (المتحكم في شدة الصوت) قد يحتوي على زر (خفي) لتضخيم صوت المايكروفون
(عليك تجريب أيها أفضل به أو دونه). صل اللاقط (المايكروفون) افتح المازج mixer ثم تأكد من أنه يعمل
ثم اكتب الأمر التالي
(تستطيع كتابته على سطر واحد إذا حذفت علامة \ لكن للتوضيح قمت بوضع علامة \ متبوعة بالضغط
على مفتاح [Enter] ثم المتابعة على السطر التالي ثم ضغط [Enter])
ولكن قبل أن تضغط [Enter] الأخيرة اكتم السماعات لتفادي تأثير التغذية الراجعة
bash$ gst-launch alsasrc ! audio/x-raw-int,rate=8000,channels=1 ! \
audioconvert ! vorbisenc ! oggmux ! filesink location=myfile.ogg
تحدث وسجل ثم اضغط CLTR+C عندما تنتهي ثم استمع للملف الذي سجلته.
هذه السلسلة الطويلة تبدأ من مصدر alsasrc وهو تعريف ALSA في نواة لينكس لبطاقة الصوت
ويمكننا استبداله بتعريف OSS عبر مصدر osssrc ولا فرق إذ إن ALSA متوافق مع OSS لكن استخدام OSS أكثر توافقية
فإذا كانت النواة قديمة لا تدعم ALSA فإنه ALSA لن يعمل أما إن كانت حديثة فكلاهما سيعمل.
وتنتهي السلسلة بصرف السيالات إلى ملف filesink حددنا اسمه myfile.ogg.
اما ما تحته خط مما يلي alsasrc ليس عنصراً بل هو CAPS أي تحديد الامكانيات فبطاقة الصوت قد تدعم عدة إمكانيات (استعمل gst-inspect متبوعة ب alsasrc لتعرف ما يدعمه من إمكانيات) هنا نحدد أولاً النوع MIME TYPE وهو سيالات صوتية audio غير مضغوطة raw وصحيحة int أي عكس النسبية float ثم وبعد الفاصلة نحدد بعض الإمكانيات مثل معدل العينة rate ليكون 8000 Hz
وعدد القنوات بقناة واحدة أي ليس ستيريو (قناتين يمينى ويسرى)
ثم حولناها بواسطة audioconvert إلى النوع الذي يريده vorbisenc (العنصر الذي يضغط بطريقة Vorbis)
ثم وضعناها في كبسولة Ogg بواسطة oggmux قبل أن تنتهي تلك السيالات إلى المصرف الملف myfile.ogg.
ويبدو أنه من المزعج أن لا تعرف إن كان التسجيل يعمل أم لا. لهذا سنستعمل التمثيل البصري Visualisation
وهذا يتطلب أنابيب غير خطية بل متشعبة! حيث علينا تشعيب سيالات المصدر الصوتي عبر وصلة T إلى فرعين أحدها
يذهب إلى ملف والآخر يذهب إلى التمثيل البصري.
bash$ gst-launch alsasrc ! audio/x-raw-int,rate=8000,channels=1 ! tee name=t0 ! \
queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=myfile.ogg \
t0. ! queue ! monoscope ! ffmpegcolorspace ! xvimagesink
إذا لم يكن monoscope موجوداً لديك استعمل goom (الأخير أجمل لكن الأول أكثر فائدة)
هذه السلسلة المتوحشة تختلف بأننا أضفنا العنصر tee واستعملنا الخاصية name كي نعود إليه لاحقاً بالاسم t0.
كما أننا استعملنا queue مرتين حتى تتزامن الأحداث فإذا كان هذا أو ذاك سريعاً تم تخزين بعض منه في buffer بانتظار دوره في الطابور.
لاحظ عدم وجود أنبوب ! بعد اسم الملف مما يعني أن المصرف filesink لا يرتبط بما بعده أي أن ما بعده إما خاصية (تعرف من علامة المساواة) أو بداية أنبوب آخر (إنتبه للنقطة بعد t0).
وهي الآن بداية أنبوب آخر يبدأ مصدره من العنصر الذي أسميناه t0 وهو مفرعة السيالات tee. ندخل تلك السيالات الصوتية على الطابور لتنتظر دورها فتكون متزامنة ولتخرج في الوقت المناسب إلى الراسمة monoscope والتي يشير gst-inspect أنها تستقبل صوتاً صحيحاً غير مضغوط audio/x-raw-int وتخرج صورة فيديو خام غير مضغوطة بترميز لوني RGB أي video/x-raw-rgb
لاحظ مخرجات
bash$ gst-inspect monoscope | grep -A 3 'SRC template:'
SRC template: 'src'
Availability: Always
Capabilities:
video/x-raw-rgb
bash$ gst-inspect monoscope | grep -A 3 'SINK template:'
SINK template: 'sink'
Availability: Always
Capabilities:
audio/x-raw-int
يمكن عمل الأنابيب السابقة نفسها بالطريقة التالية
bash$ gst-launch alsasrc ! audio/x-raw-int,rate=8000,channels=1 ! tee name=t0 \
t0. ! queue ! audioconvert ! vorbisenc ! oggmux ! filesink location=myfile.ogg \
t0. ! queue ! monoscope ! ffmpegcolorspace ! xvimagesink
لاحظ أنني بدلا من وصل وصلة T إلى الطابور الاول أنهيت وصف الأنبوب ولم أتبه بأنبوب آخر بل بدأت أنبوبين منفصلين.
يجدر بي أن أذكر أن وصلة T تستطيع أن تفرع إلى أي عدد وليس إثنان فقط لنشغل ملف myfile.ogg ونرسله إلى الصوت وإلى التمثيل البصري goom و monoscope
bash$ gst-launch filesrc location=myfile.ogg ! decodebin ! audioconvert ! audio/x-raw-int ! tee name=t0 \
t0. ! queue ! osssink \
t0. ! queue ! goom ! ffmpegcolorspace ! xvimagesink \
t0. ! queue ! monoscope ! ffmpegcolorspace ! xvimagesink
لنجرب الآن التسجيل بطريقة Ogg/Speex
bash$ gst-launch alsasrc ! audio/x-raw-int,rate=8000,channels=1 ! tee name=t0 ! \
queue ! audioconvert ! speexenc ! oggmux ! filesink location=myfile.ogg \
t0. ! queue ! monoscope ! ffmpegcolorspace ! xvimagesink
ضبط جودة التسجيل
لاحظ أنني اخترت معدل عينة منخفض للتسجيل وهو 8000 Hz يمكنك زيادة معدل العينة مثلاً ليصبح بالجودة العالية 44100 Hz أو بالجودة المتوسطة 22050 Hz.
إذا كنت تنقل من مصدر به معدل عينة لا يدعم ما تريد يمكنك بدلا من اختيار معدل العينة استعمال إعادة تحصيل العينة (إعادة التحصيل إلى معدل أعلى لا تزيد الجودة، لكنها تكون مفيدة إذا كنت تريد تقليلها دون المستوى الذي تدعمه بطاقة الصوت أو لتزيده لأن بطاقة الصوت لا تدعم ذلك المعدل المنخفض) ويكون ذلك بواسطة audioresample بعد الأنبوب ! تذكر بعدها الإمكانيات التي تريد (ستكون مفيدة في التحويل لا في التسجيل)
في السابق لم نقم بتحديد الجودة التي نريد ولا معدل البتات واكتفينا بالقيم التلقائية.
اكتب gst-inspect متبوعة ب vorbisenc أو speexenc لتعرف الخيارات الموجودة.
ولتسجيل أصوات متداخلة (موسيقى أو صوت كورال منشدين في الخلفية أو مؤثرات او صدى ..إلخ) عند معدل عينة 44100 Hz فإني أستعمل vorbisenc مع الخيارات
quaity=-0.1
وهي أقل جودة في Vorbis لكن مع معدل العينات العالي واستخدام تكنولوجيا VBR أي معدل بتات متغيّر وذلك من خلال تحديد الجودة
حيث يزيد ويقلل معدل البتات بطريقة ملائمة جداً للصوت المراد تمثليه بحيث يحافظ على الجودة خصوصاً أننا لا نسجل معازف.
(القيمة التلقائية للجودة هي 0.3 وهي ربما هكذا من أجل المعازف).
وذلك بدلاً من تحديد ال bitrate برقم ثابت حتى عندما يستكت الصوت.
كما أن هناك مدير VBR بديل يكون بالخيار managed=true
(عندما جربته كان الحجم نفسه لكن الوثائق تقول إنه أقل سرعة وجودة)
إذا كنت تسجل تلاوة مرتلة للقرآن بصوت ندي مؤثر أنصحت ب vorbis. أما إذا كانت محاضرة كلام عادي فإني أنصحك بطريقة speex
quaity=2 vbr=true complexity=10
قيم 5 أو 8 للجودة quality قد تبدو جيدة عند التسجيل على معدل عينة أقل من 44100 Hz لكن إذا كان المصدر بمعدل عينة 44100 فإن 2 تبدو أكثر من كافية للحفاظ على جودة الكلام العادي.
طريقة التحويل
كما ذكرنا سابقاً أن أفضل مصدر للتحويل منه هو القرص الصوتي غير المضغوط Audio CD (وهو بمعدل 44100 Hz) إن لم يكن مخدوشاً
أو أي هيئة أخرى مثل ملفات WAV غير المضغوطة بشرط أن تكون معدل العينة عالية
(قد يصل فيها حجم الدقيقة الواحدة أكثر من ميغابايت!) أو تلك المخزنة بضغط غير فاقد للجودة مثل FLAC.
أما التحويل من MP3 (أو Ogg/Vorbis) فإنه يكون حلاً عملياً غير مضمون النتائج وقد يكون مفيداً إذا كانت بجودة عالية مثلاً MP3 بمعدل 44100 Hz وبجودة حوالي 128 Kb/s تعطي نتائج جيدة عندما يكون الهدف هو تقليل الحجم على حساب الجودة التي لا يمكن الاحساس بها.
لنبدأ بتحويل أول مسار من القرص الصوتي المدمج Audio إلى ملف file.ogg بهيئة Ogg/Vorbis
بالأمر التالي: (يمكنك وضع 2 مكان 1 للمسار الثاني)
bash$ gst-launch cdda://1 ! audioconvert ! \
vorbisenc quality=-0.1 ! oggmux ! filesink location=file.ogg
يمكنك تحديد الجودة التي تريد بوضعها مكان quality=-0.1.
لتحويل قرص كامل به 10 مسارات من 1 إلى 10 إلى الملفات من file-1.ogg إلى file-10.ogg بالأمر
bash$ for i in $(seq 10); do gst-launch cdda://${i} ! audioconvert ! \
vorbisenc quality=-0.1 ! oggmux ! filesink location=file-${i}.ogg; done
لنفترض أن لدينا ملفاً (مثلاً اسمه file.mp3) يمكن لبرنامج gst-launch
تحويله إلى الملف file.ogg بالطريقة السابقة
bash$ gst-launch filesrc location=file.mp3 ! decodebin ! audioconvert ! \
vorbisenc quality=-0.1 ! oggmux ! filesink location=file.ogg
يتفرض الآن أنك تجد هذه السلسلة بسيطة، بدأنا بمصدر من ملف filesrc وانتهينا بمصرف إلى ملف filesink.
التحويل إلى هيئة Ogg/Speex نضع speexenc مكان vorbisenc بالأمر:
bash$ gst-launch filesrc location=file.mp3 ! decodebin ! audioconvert ! \
speexenc quality=2 vbr=true complexity=10 ! oggmux ! filesink location=file.spx
يمكن تحويل عدد كبير من الملفات إلى Ogg/Speex دفعة واحدة بالأمر
bash$ for i in *.mp3; do gst-launch filesrc location=${i} ! decodebin ! audioconvert ! \
speexenc quality=2 vbr=true complexity=10 ! oggmux ! filesink location=${i/.mp3/.spx}; done
يجب أن تلاحظ أن لينكس حساس لحالة الحروف ف MP3 غير mp3.
يمكنك التحويل إلى Ogg/Speex و Ogg/Vorbis دفعة واحدة عبر
bash$ for i in *.mp3; do gst-launch filesrc location=${i} ! decodebin ! tee name="t0" \
t0. ! queue ! audioconvert ! speexenc quality=2 vbr=true complexity=10 ! \
oggmux ! filesink location=${i/.mp3/.spx} \
t0. ! queue ! audioconvert ! vorbisenc quality=-0.1 ! \
oggmux ! filesink location=${i/.mp3/.ogg} ; done
مقارنات
عندما قمت بتحويل ملف MP3 به صوت بشري (قصة آدم عليه السلام للشيخ نبيل العوضي) حجمه 46 ميغابايت
بمعدل عينة 44100 Hz ستيريو.
كانت النتيجة بطريقة Vorbis بجودة 0.3 فكان الحجم 34 ميغابايت
وبجودة سالب 0.1 كان الحجم 14 ميغابايت
وبطريقة Speex بجودة 2 فكان الحجم 6.3 ميغابايت.
وكل المحاضرات بهيئة MP3 كانت بحجم 328 ميغابايت و Vorbis بجودة سالب 0.1 كان بحجم 103 ميغابايت
(حوالي الثلث)
وكانت Speex بجودة 2 بحجم 46 ميغابايت.
أما للمقارنة مع Real Audio فإنني قم بتجربة ذلك على ملف طويل طوله أكثر من ربع ساعة بقليل
وهو بهيئة Real Audio G2 Cook بقناة واحدة mono بمعدل العينة 44100 Hz
(وهي قصيدة "ليس الغريب" بصوت مشاري العفاسي)
فكان حجمه 3.7 ميغابايت فكان حجمه بهيئة Ogg/Vorbis عند نفس معدل العينة 3.4 ميغابايت.
أما إذا قمنا بتخفيض الجودة إلى معدل عينة أقل مثلاً 11025 KHz فإن الحجم يصبح 1.8 ميغابايت.
|