دائرة الرقابة الداخلية جلكيت:ضبط نسيج GLKBaseEffect مع إخراج الكاميرا

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

  •  20-12-2019
  •  | 
  •  

سؤال

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

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer (CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {

CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);

effect.texture2d0.name = CVOpenGLESTextureGetName(pixelBuffer);
}
هل كانت مفيدة؟

المحلول

تلدر: لا أعتقد أنه يمكنك استخدام إخراج الكاميرا مع GLKBaseEffect — البيانات من الكاميرا تكون بتنسيق YUV ثنائي المستوى، لذلك تحتاج إلى تظليل جزء مخصص لتحويل ذلك إلى RGB في وقت العرض، و GLKBaseEffect لا يفعل تظليل مخصص.

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

رغم ذلك CVOpenGLESTexture النوع مشتق من CVPixelBuffer, ، المخازن المؤقتة للصور التي تعود منها CMSampleBufferGetImageBuffer لا تكون زخارف OpenGL ES تلقائيًا.تحتاج إلى إنشاء أنسجة من مخازن الصور المؤقتة في كل مرة تحصل فيها على إطار من الكاميرا باستخدامه CVOpenGLESTextureCache.

تفاح GLCameraRipple يوضح نموذج التعليمات البرمجية كيفية القيام بذلك.إليك نظرة عامة سريعة:

  1. بعد إعداد سياق GL، سيتم setupAVCapture استدعاءات الطريقة CVOpenGLESTextureCacheCreate لإنشاء ذاكرة تخزين مؤقت للنسيج مرتبطة بهذا السياق.
  2. في captureOutput:didOutputSampleBuffer:fromConnection:, ، يحصلون على المخزن المؤقت للصورة من المخزن المؤقت للعينة باستخدام CMSampleBufferGetImageBuffer, ، ثم أنشئ نسيجي OpenGL ES منه باستخدام ذاكرة التخزين المؤقت للنسيج CVOpenGLESTextureCacheCreateTextureFromImage وظيفة.أنت بحاجة إلى مادتين لأن المخزن المؤقت للصورة يحتوي على بيانات ألوان YUV في مستويين بت.
  3. يتم ربط كل نسيج بالعرض مباشرة بعد إنشائه، وذلك باستخدام glBindTexture.بشكل عام، يمكنك استبدال أ glBindTexture الاتصال مع الإعداد أ GLKBaseEffecttexture2d0.name ويخبره بذلك prepareToDraw, ، لكن GLKBaseEffect لا يمكن عرض YUV.
  4. ارسم باستخدام النسيجين المرتبطين، باستخدام برنامج التظليل الذي يقوم تظليل الأجزاء الخاص به أولاً بإنشاء متجه YUV من خلال الجمع بين مكونات من مواد Y وUV، ثم يقوم بضرب مصفوفة بسيطة لتحويلها إلى لون بكسل RGB وفقًا لمواصفات مساحة ألوان HDTV .

نظرًا لأنك تحتاج إلى تظليل جزء مخصص لتحويل YUV إلى RGB، GLKBaseEffect لن يساعدك.ومع ذلك، كما GLCameraRipple من العروض النموذجية، فإن التظليل المخصص الذي ستحتاج إلى كتابته ليس مخيفًا إلى هذا الحد.

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