معالجة الفيديوهات القادمة من المستخدم

السلام عليكم يا معشر الــ Backend :smile:

أحاول تطوير برمجية بسيطة تسمح للمستخدمين برفع فيديوهات و صور استخدمت خدمة S3 من AWS
فهي تسمح لنا برفع جميع انواع الملفات :smile:
لكن الان المشكلة الحقيقية هي في نوعية تلك الملفات الامتداد الخاص بها
مثلا في بعض الاحيان يكون امتداد الفيديو لا يكون mp4 وبعد رفع الفيديو يجب عليك عرضه فقمت باستخدام احدى مكتبات js الخاصة بتشغيل الفيديوهات لكن مع الاسف هذه المكتبات لا تدعم تشغيل جميع انواع الفيديوهات ومنها .mov

ما هو الحل الأمثل رفع الملفات كما هي بتنسيقها الاصلي ام معالجتها ثم رفعها
اقصد بالمعالجة تحويل نوع اي ملف الى صيغة mp4 باستخدام مكتبات جاهزة مثل : ffmpeg

بحسب فهمي الحالي لـ Django لو كنت اريد معالجة الفيديو سيتم استقباله في view من request وحفظه كـ object ثم معالجته كتغيير صيغة او ضغط الحجم الخ…
ثم بعد ذلك اقوم بحفظه في المساحة التخزينية s3 لكن اين تتم هذه العملية على السيرفر ؟

وهل هذا يؤثر على عمل السيرفر لنفرض ان حجم الفيديو ربما سيصل الى 100mb ؟

كيف سيتم التعامل مع هذه ال request التي تحمل ملفات بحجم كبير ؟؟

5 Likes

اهلا بك يا سامر :v:

ما تحاول القيام به هو شبيه برفع الفيديوهات على اليوتيوب وهو سيقوم بضغطه وانتاج جودات مختلفة من نفس الفيديو.

نعم هذا ما ستقوم به، أو الأفضل أن تستعمل job queue مثل celery لكي تمر العملية بهذا الشكل:

  1. يرفع المستخدم الفيديو
  2. يستقبل السيرفر ملف الفيديو
  3. يقوم السيرفر مباشرة في الـ view بإطلاق عملية job إلى داخل الطابور queue
  4. يعالج العملية job حسب الطابور بالترتيب (بحيث لا تثقل كثيراً على السيرفر)
  5. متى ما انتهت الـ job وأصبح الملف جاهز، سيتم اعلام المستخدم داخل الـ job (مثلا ترسل ايميل أو تكتب اشعار في الصفحة)

بالنسبة لمعالجة ملفات الميديا هناك عدة خيارات لديك بالتعامل معها:

1. تقوم باستعمال موارد السيرفر للقيام بهكذا عمليات، باستعمال encoder مثل ffmpeg

هذه الطريقة مناسبة في حال كان لديك مستخدمين قلائل (أقل من 10 ألف).

لأنها ستقلل التكاليف، وأيضاً لو لاحظت أي بطئ فقط تزيد من كمية الموارد في السيرفر (ram + cpu).

بالتأكيد يجب أن ترفع الفيديوهات الجديدة على S3 لكي لا يرتفع الضغط على السيرفر حينما تقوم بعرض الملفات.

2. تستعمل خدمة من الكلاود مثل AWS Transcoder

هذه الخدمة ستوفر عليك التعب البرمجي في انتاج الفيديوهات، وأيضاً هكذا ستتحمل أي ضغط من المستخدمين (كونها تتم في سيرفر آخر).

هذا رابط الخدمة: https://aws.amazon.com/elastictranscoder/

العيب الوحيد أنها ربما تكون مكلفة جدا (لكن هذا يعني أن لديك مستخدمين كثر، ووقتها يجب أن يكون لديك أرباح أكثر تغطي هذه التكاليف).

يوجد أيضاً خدمات أخرى قد تكون أرخص مثل (متخصصة في التعامل مع الـ media، وخدماتهم المجانية ربما تكفيك):

  • لا أدري ما اذا كانت خدمات الكلاود تناسبك أكثر (سعر + تحمل ضغط)، في حالة كنت تريد التخلص من وجع الرأس استعملها وريح بالك :grin:
4 Likes

بالفعل والسعر جدا معقول 0.0075$ لكل دقيقة مخرجة من الفيديو

كل ١$ سينتج ١٣٣ دقيقة :heart_eyes:

والعمل خارج السيرفر :heart_eyes:

وبتحاسبني ع قد الطلب :joy:

2 Likes

هل الافضل فحص طول الفيديو في المشروع لو كان يتجاوز قياس محدد ام افحص الطول بالجافا سكريبت
خدمة elastictranscoder ما شاهدت فيها تحديد الطول output ذاكرين الترميز والصيغة المخرجة و مدل البت بالثانية

هل فحص طول الفيديو سيؤثر على السيرفر عند جلبه ؟

2 Likes

جربتها بالجافاسكريبت :joy:
الحل جدا سهل
وجربت هذا الكود js

جربت رفع الفيديو لاحظت ان ال js تعمل محلياً على المتصفح بمجرد انتهائي من اختيار الفيديو قبل رفعه طبع النتيجة :heart_eyes:

سآحل الموضوع محلياً باستخدام js و elastictranscoder تقوم بالباقي
لا تعمل على سيرفر البحرين الـ elastictranscoder
مع الاسف عملت دلو BUCKET جديد على سيرفر اوروبي . ونقلت الداتا من القديمة
بقي الان تجريب elastictranscoder
سآكتب المشاكل والحلول هنا لو حصلت معي :joy:

بعد تطبيق محتوى هذا الـ فيديو

كانت تظهر لي هذه المشكلة

ال status error

هل هناك شيء يجب عمله من ناحية BUCKET خاصتي لتعمل الخدمة ؟؟
لآنه عندما اقوم بآضافة jobs يكون ال status Submitted .
الصورة توضح


لكن بعد تحديث الصفحة اجد ال status error

اي حل او توضيح هل هو خطأ من aws او من اعدادات حسابي في aws

يفضل أن تقوم بالفحص في السيرفر (لأن الـ js يقدر الواحد يتلاعب عليها)

لكن لو ضبطت معك في js وشفت أنها تكفي (وعندك limit لحجم الملفات في السيرفر أثناء الرفع)، عندها لا مشكلة.

لا أدري صراحة، لكن شاهدت هذا الفيديو ويبدو كل شيء سلس:

جرب عمل bucket في منقطة أخرى zone، مثلاً us-east-2 (Ohio) وأعد الخطوات

1 Like