Обработка живого видео (вход / выход видео, а не просто запись или просто воспроизведение) с настольным openGL часто выполняется многопоточным, но для этого требуется поддержка совместного использования контекста (так что отдельные контексты в отдельных потоках могут ссылаться на один и тот же дескриптор ресурса). space.) Совместное использование контекста поддерживается в OpenGL ES, но не в WebGL (пока), хотя я думаю, что оно поддерживается в WebCL. Таким образом, хотя WebWorkers и поддерживается, использование WebGL, по-видимому, фактически ограничено одним потоком.
Но, когда (не если) WebGL поддерживает совместное использование контекста, я полагаю, самым быстрым способом будет изолировать подготовку текстур во вспомогательном потоке с общим контентом, а затем запустить на них шейдеры GL в главном компостирующая нить.
В настольном openGL один из способов сделать это - объявить закадровое окно 1x1 (элемент canvas) со своим собственным контекстом, связанным с уникальным потоком, выполняющим подготовку. Эти контексты совместно используются с основным потоком, в котором происходит окончательное наложение.
Когда (я думаю, нет, если) WebGL поддерживает совместное использование, ищите альтернативную подпись в getContext (), которая разрешает совместное использование с другим контекстом.
Если вы попытаетесь сделать этот вид обработки видео однопоточным, вы столкнетесь с проблемой «двух часов». (Входной видео контракт, выходной видео контракт.) Вы должны изолировать задержку обработки от этих жестких часов через FIFO / кэш и многопоточность, иначе вы получите сбой на выходе или пропустите входные кадры. Необходимость FIFO / кеша приводит к задержке обработки видео, и если вы пропускаете звук, вам нужно будет задержать звук для соответствия. Это можно легко сделать с помощью кольцевого буфера с круговым циклом со смещением между записью и воспроизведением.