في المقال السابق، قمنا بإنشاء ملف فيديو مضغوط باستخدام الترميز H.264 ومخزّن داخل حاوية MKV باستخدام العنصر videotestsrc . ورغم أن ذلك كان مفيدًا لفهم أساسيات GStreamer ، فإن التطبيقات الحقيقية غالبًا ما تتعامل مع ملفات وسائط موجودة مسبقًا.

في هذا المقال، سنتعلم كيفية قراءة وتشغيل ملف فيديو باستخدام GStreamer لنبدا.

المحتويات

  • تنزيل ملف فيديو تجريبي
  • استكشاف محتويات الملف
  • تشغيل الفيديو باستخدام GStreamer
  • التعرف على filesrc
  • التعرف على decodebin
  • التعرف على videoconvert
  • فهم مفهوم Dynamic Pads

تنزيل ملف فيديو تجريبي

سنستخدم فيديو Big Buck Bunny الشهير.

يمكنك تنزيله باستخدام المتصفح أو من خلال الطرفية

curl -o big_buck_bunny_720p_h264.mov \
https://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_720p_h264.mov

استكشاف محتويات الملف

قبل بناء خط الأنابيب (Pipeline) ، من المفيد معرفة ما يحتويه الملف.

افتح الملف باستخدام برنامج VLC ثم انتقل إلى:

Tools → Codec Information

أو استخدم الاختصار:

Ctrl + J

ستجد معلومات مشابهة للتالي:

Stream 0: (Video)
    Codec: H264 - MPEG-4 AVC (part 10) (avc1)
    Resolution: 1280x720
    Frame Rate: 24 FPS

Stream 1: (Audio)
    Codec: MPEG AAC Audio (mp4a)
    Bitrate: 448 kb/s
    Sample Rate: 48000 Hz
    Bits Per Sample: 16

يمكننا ملاحظة أن الملف يحتوي على مسارين:

  1. فيديو بترميز H.264
  2. صوت بترميز AAC

ملف MOV هو صيغة حاوية وسائط متعددة طورتها شركة Apple ضمن إطار عمل QuickTime . وكما هو الحال مع MP4 و MKV ، يمكنه احتواء عدة مسارات مثل الفيديو والصوت والترجمات والبيانات الوصفية. الحاوية تختلف عن الترميزات الموجودة بداخلها.


تشغيل الفيديو

لنبدأ بخط أنابيب بسيط:

gst-launch-1.0 \
filesrc location=big_buck_bunny_720p_h264.mov \
! decodebin \
! videoconvert \
! autovideosink

عند تشغيل الأمر، ستظهر نافذة الفيديو ويبدأ التشغيل مباشرة.

على الرغم من أن الملف يحتوي على مسار صوتي، فإن هذا الخط يعرض الفيديو فقط ويتجاهل الصوت.


فهم خط الأنابيب

filesrc

العنصر filesrc مسؤول عن قراءة البيانات الخام من ملف موجود على القرص.

File
filesrc

في هذه المرحلة لا يعرف GStreamer ما إذا كان الملف يحتوي على فيديو أو صوت أو ترجمات أو أي نوع آخر من البيانات.


decodebin

يُعد decodebin من أكثر العناصر فائدة في GStreamer .

يقوم تلقائيًا بالمهام التالية:

  1. اكتشاف نوع الحاوية.
  2. إنشاء عنصر الفصل المناسب (Demuxer) .
  3. إنشاء مفككات الترميز المطلوبة (Decoders) .
  4. توفير البيانات بعد فك الترميز.

بالنسبة لملفنا، يقوم decodebin داخليًا بإنشاء عناصر مشابهة للتالي:

MOV File
qtdemux
 ├─ H264 Stream
 └─ AAC Stream

H264 Stream
H264 Decoder
Raw Video

وبالتالي فإن خرج decodebin لم يعد بيانات H.264 مضغوطة، بل إطارات فيديو خام جاهزة للمعالجة أو العرض.


videoconvert

ليست جميع عناصر العرض تدعم نفس تنسيقات البكسلات.

يقوم videoconvert بتحويل تنسيق الفيديو تلقائيًا عند الحاجة.

Raw Video
videoconvert
Compatible Raw Video

وجود هذا العنصر يجعل خطوط الأنابيب أكثر توافقًا بين أنظمة التشغيل المختلفة.


autovideosink

العنصر autovideosink يختار تلقائيًا أفضل عنصر عرض فيديو متاح على النظام.

اعتمادًا على نظام التشغيل والبيئة الرسومية، قد يستخدم عناصر مختلفة داخليًا.

Raw Video
autovideosink
Screen

وبذلك لا نحتاج إلى معرفة عنصر العرض المناسب لكل منصة.


مفهوم Dynamic Pads

بعكس filesrc أو videoconvert ، لا يعرف decodebin مسبقًا عدد المسارات الموجودة داخل الملف.

فقد يحتوي الملف على:

  • فيديو فقط
  • صوت فقط
  • فيديو وصوت
  • عدة مسارات صوتية
  • ترجمات

لهذا السبب يقوم decodebin بإنشاء منافذ الخرج (Pads) بشكل ديناميكي بعد تحليل الملف.

decodebin
 ├─ video pad
 └─ audio pad

عند استخدام gst-launch-1.0 يتم التعامل مع هذه المنافذ الديناميكية تلقائيًا.

أما عند كتابة تطبيقات باستخدام C++ أو Rust ، فسيتعين علينا التعامل مع الإشارة pad-added وربط المنافذ يدويًا.

وسنغطي هذا الموضوع بالتفصيل في المقالات القادمة.


الملخص

في هذا المقال تعلمنا كيفية تشغيل ملف فيديو موجود مسبقًا باستخدام GStreamer .

كما تعرفنا على العناصر التالية:

  • filesrc لقراءة الملفات.
  • decodebin لاكتشاف الحاوية وفك الترميز تلقائيًا.
  • videoconvert لتحويل تنسيقات الفيديو.
  • autovideosink لعرض الفيديو.
  • مفهوم المنافذ الديناميكية Dynamic Pads .

في المقال القادم سنتعرف على أداة gst-discoverer-1.0 لاستكشاف ملفات الوسائط والتعرف على المسارات والترميزات الموجودة بداخلها مباشرة من سطر الأوامر.


تمارين

  1. استبدل autovideosink بعنصر عرض خاص بمنصتك.
  2. جرّب تشغيل أنواع مختلفة من ملفات الوسائط ولاحظ كيف يتعامل decodebin معها.
  3. استخدم الأمر التالي لمعرفة المزيد عن decodebin :
gst-inspect-1.0 decodebin
  1. جرّب تشغيل ملف يحتوي على صوت فقط ولاحظ ما يحدث.

أسئلة

  1. ما الفرق بين الحاوية (Container) والترميز (Codec)؟
  2. لماذا نحتاج إلى decodebin في هذا المثال؟
  3. ما المشكلة التي يحلها videoconvert ؟
  4. لماذا يقوم decodebin بإنشاء المنافذ بشكل ديناميكي؟
  5. لماذا تم تجاهل مسار الصوت AAC في خط الأنابيب الحالي؟