Come eseguire il rendering ed elaborare in modo efficiente i flussi video utilizzando la GPU?

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

  •  20-08-2019
  •  | 
  •  

Domanda

Ho intenzione di sviluppare uno strumento per la manipolazione di video in tempo reale utilizzando C++, Qt e OpenGL.La sovrapposizione video non è un'opzione poiché gli shader dovrebbero essere utilizzati per l'elaborazione dei fotogrammi.Al momento immagino la seguente sequenza di passaggi:

  1. Decodifica video (CPU)
  2. Preelaborarlo (opzionale, CPU)
  3. Trasferiscilo nella memoria video (GPU utilizzando DMA)
  4. Elaboralo ulteriormente utilizzando shader di vertici e frammenti (GPU)
  5. Rendering (GPU)

Sto cercando qualche consiglio generale che spieghi quali estensioni o tecniche possono essere utilizzate qui.C'è invece una buona ragione per utilizzare Direct3D?

È stato utile?

Soluzione

Per prima cosa, sul PC non esiste un modo esplicito per utilizzare DMA.L'autista Potrebbe usalo o potresti usare qualcos'altro.

In ogni caso, il passaggio 3 sarà "modificare i dati della trama sulla scheda grafica".In OpenGL questa è l'estensione PBO (Pixel Buffer Object) o la buona vecchia funzione glTexSubImage*.In D3D9 è LockRect sulla texture o in altri modi (ad es.LockRect su una texture scratch, quindi trasformata in una texture GPU).Qualcuno di questi potrebbe potenzialmente utilizzare DMA, ma non puoi esserne sicuro.

Quindi i dati sono in una trama.Puoi renderizzarlo su uno schermo con alcuni shader (ad es.eseguendo la conversione YCbCr) o renderizzando in altre texture per eseguire effetti di elaborazione più complessi (ad es.sfocatura/bagliore/...).

Usare Direct3D è più semplice nel senso che esistono "modi sprecati" chiaramente definiti per fare le cose.In OpenGL ci sono molte più opzioni per fare qualsiasi cosa e devi in ​​qualche modo capire quali sono veloci (a volte i percorsi veloci sono diversi su piattaforme o hardware diversi).

Altri suggerimenti

Se sei Linux, i driver recenti di NVIDIA nella serie 180.xx hanno aggiunto il supporto per la decodifica video tramite l'API VDPAU (Decodifica video e presentazione qualcosa). Molti importanti progetti si sono integrati con l'API tra cui mplayer, vlc, ffmpeg e mythtv. Non conosco tutti i dettagli, ma forniscono api per molti codec tra cui operazioni secondarie comuni e manipolazione bitstream.

Guarderei qui prima di andare direttamente a CUDA (che presumo possa essere utilizzato da VDPAU)

Per trasferire i dati del frame da CPU a GPU, ti consigliamo di consultare PBO s. Controlla anche questo .

Inoltre, anche se si utilizzano shader, è possibile alleggerire il carico della CPU eseguendo trasformazioni dello spazio colore negli shader di frammenti (da YCbCr a RGB).

Il " ulteriore elaborazione " e " rendering " i passaggi di solito sono praticamente la stessa cosa, fai cose fantastiche negli shader e mescolale al framebuffer. Se desideri mescolare e abbinare video ed effetti diversi, FBO s sono utili anche.

In alternativa puoi guardare alcune delle diverse lingue per eseguire la programmazione GPU per scopi generici (GPGPU) come CUDA di NVIDIA o Stream SDK di ATI. Tuttavia, a seconda della scelta, puoi limitarti a una marca di GPU. La ragione per usare questi linguaggi sarebbe lavorare a un livello di astrazione che è più vicino alla normale programmazione di alto livello invece di lavorare con gli shader.

Non ho esperienza con quello che vuoi fare, quindi non posso dire se gli shader sono effettivamente più adatti per il lavoro, ma è qualcosa che puoi considerare di guardare. Bisogna dire che il design dell'algoritmo è ancora in qualche modo diverso dal codice ordinario e ci vuole un po 'di sforzo per farlo (ho lavorato solo con CUDA ma tutti sembrano usare astrazioni simili).

Suppongo che se hai una discreta esperienza con il lavoro sugli shader, potrebbe non valere la pena di imparare una nuova piattaforma.

I seguenti passaggi dovrebbero farlo:

  1. decodifica video in YUV

    Di solito è ciò che fanno le librerie del decodificatore.

  2. Carica in OpenGL come trama

  3. converti YUV in RGB

    Dato che non vuoi usare un overlay, devi convertirlo manualmente. Qui è un esempio che utilizza shader.

  4. posiziona la trama convertita su un quad e renderla sullo schermo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top