Post04 Playing Video File With Gstreamer
في المقال السابق، قمنا بإنشاء ملف فيديو مضغوط باستخدام الترميز 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
يمكننا ملاحظة أن الملف يحتوي على مسارين:
- فيديو بترميز H.264
- صوت بترميز 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
.
يقوم تلقائيًا بالمهام التالية:
- اكتشاف نوع الحاوية.
- إنشاء عنصر الفصل المناسب (Demuxer) .
- إنشاء مفككات الترميز المطلوبة (Decoders) .
- توفير البيانات بعد فك الترميز.
بالنسبة لملفنا، يقوم 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
لاستكشاف ملفات الوسائط والتعرف على المسارات والترميزات الموجودة بداخلها مباشرة من سطر الأوامر.
تمارين
- استبدل
autovideosinkبعنصر عرض خاص بمنصتك. - جرّب تشغيل أنواع مختلفة من ملفات الوسائط ولاحظ كيف يتعامل
decodebinمعها. - استخدم الأمر التالي لمعرفة المزيد عن
decodebin:
gst-inspect-1.0 decodebin
- جرّب تشغيل ملف يحتوي على صوت فقط ولاحظ ما يحدث.
أسئلة
- ما الفرق بين الحاوية (Container) والترميز (Codec)؟
- لماذا نحتاج إلى
decodebinفي هذا المثال؟ - ما المشكلة التي يحلها
videoconvert؟ - لماذا يقوم
decodebinبإنشاء المنافذ بشكل ديناميكي؟ - لماذا تم تجاهل مسار الصوت AAC في خط الأنابيب الحالي؟