كيفية عرض ومعالجة تدفقات الفيديو بكفاءة باستخدام GPU؟

StackOverflow https://stackoverflow.com/questions/480460

  •  20-08-2019
  •  | 
  •  

سؤال

أخطط لتطوير أداة لمعالجة الفيديو في الوقت الفعلي باستخدام C++ وQt وOpenGL.لا يعد تراكب الفيديو خيارًا حيث يجب استخدام التظليل لمعالجة الإطارات.في هذه اللحظة أتخيل التسلسل التالي من الخطوات:

  1. فك تشفير الفيديو (وحدة المعالجة المركزية)
  2. المعالجة المسبقة (اختياري، وحدة المعالجة المركزية)
  3. نقله إلى ذاكرة الفيديو (وحدة معالجة الرسومات باستخدام DMA)
  4. مزيد من المعالجة باستخدام تظليل قمة الرأس والجزء (GPU)
  5. تقديمه (وحدة معالجة الرسومات)

أنا أبحث عن بعض النصائح العامة التي تشرح الامتدادات أو التقنيات التي يمكن استخدامها هنا.هل هناك سبب وجيه لاستخدام Direct3D بدلاً من ذلك؟

هل كانت مفيدة؟

المحلول

أول شيء، على جهاز الكمبيوتر، لا توجد طريقة واضحة لاستخدام DMA.السائق قد استخدامه، أو قد يستخدم شيئا آخر.

على أية حال، الخطوة الثالثة ستكون "تغيير بيانات النسيج على بطاقة الرسومات".في OpenGL يكون امتداد PBO (Pixel Buffer Object) أو وظيفة glTexSubImage* القديمة الجيدة.في D3D9 يكون LockRect على النسيج أو بطرق أخرى (على سبيل المثال.LockRect على نسيج خدش، ثم ادمجه في نسيج GPU).من المحتمل أن يستخدم أي من هؤلاء DMA، لكن لا يمكنك التأكد.

ثم البيانات في نسيج.يمكنك عرضه على الشاشة باستخدام بعض التظليل (على سبيل المثال.إجراء تحويل YCbCr)، أو تقديمه إلى مادة (أنسجة) أخرى لإجراء تأثيرات معالجة أكثر تعقيدًا (على سبيل المثال.طمس/توهج/...).

يعد استخدام Direct3D أسهل بمعنى أن هناك "طرقًا ضائعة" محددة بوضوح للقيام بالأشياء.يوجد في OpenGL الكثير من الخيارات لفعل أي شيء، وعليك أن تكتشف بطريقة أو بأخرى أي منها سريع (أحيانًا تختلف المسارات السريعة باختلاف الأنظمة الأساسية أو الأجهزة).

نصائح أخرى

إذا كنت تستخدم نظام التشغيل Linux، فقد أضافت برامج تشغيل NVIDIA الحديثة في سلسلة 180.xx دعمًا لفك تشفير الفيديو عبر VDPAU api (فك تشفير الفيديو وتقديم شيء ما).تم دمج العديد من المشاريع الكبرى مع واجهة برمجة التطبيقات بما في ذلك mplayer وvlc وffmpeg وmythtv.لا أعرف كل التفاصيل، لكنها توفر واجهة برمجة التطبيقات للعديد من برامج الترميز بما في ذلك العمليات الفرعية الشائعة ومعالجة تدفق البتات.

سأبحث هنا قبل الذهاب مباشرة إلى CUDA (والذي أفترض أن VDPAU قد يستخدمه)

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

أيضًا، إذا كنت تستخدم التظليل على أي حال، فيمكنك تخفيف عبء وحدة المعالجة المركزية عن طريق إجراء تحويلات مساحة الألوان في تظليل الأجزاء (YCbCr إلى RGB).

عادةً ما تكون خطوات "المعالجة الإضافية" و"العرض" هي نفس الشيء تقريبًا، قم بعمل أشياء رائعة في التظليل وامزجها مع مخزن الإطارات المؤقت.إذا كنت ترغب في مزج ومطابقة مقاطع الفيديو والمؤثرات المختلفة، مكتب العمليات الفيدراليةمفيدة أيضًا.

كبديل، يمكنك الاطلاع على بعض اللغات المختلفة لتنفيذ برمجة GPU للأغراض العامة (GPGPU) مثل CUDA من NVIDIA أو Stream SDK من ATI.اعتمادًا على ما تختاره، يمكنك قصر نفسك على علامة تجارية واحدة من وحدات معالجة الرسومات.سيكون سبب استخدام هذه اللغات هو العمل على مستوى من التجريد أقرب إلى البرمجة العادية عالية المستوى بدلاً من العمل مع التظليل.

ليس لدي أي خبرة فيما تريد القيام به، لذلك لا أستطيع أن أقول ما إذا كانت أدوات التظليل مناسبة بشكل أفضل للوظيفة أم لا، ولكن هذا شيء يمكنك التفكير في النظر إليه.يجب أن يقال أن تصميم الخوارزمية لا يزال مختلفًا إلى حد ما عن الكود العادي ويتطلب الأمر بعض الجهد لإتقانه (لقد عملت فقط مع CUDA ولكن يبدو أنهم جميعًا يستخدمون تجريدات مماثلة).

أفترض أنه إذا كان لديك قدر لا بأس به من الخبرة في عمل التظليل، فقد لا يكون من المفيد أن تتعلم منصة جديدة.

الخطوات التالية يجب أن تفعل ذلك:

  1. فك تشفير الفيديو إلى YUV

    هذا هو ما تفعله عادةً وحدات فك التشفير.

  2. قم بالتحميل إلى OpenGL كملمس

  3. تحويل YUV إلى RGB

    نظرًا لأنك لا تريد استخدام التراكب، فيجب عليك التحويل يدويًا. هنا مثال على استخدام التظليل.

  4. وضع الملمس المحول على رباعي وعرضه على الشاشة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top