Encoder en temps réel grace à directx?? - C++ - Programmation
Marsh Posté le 02-03-2004 à 18:39:28
2048 !!!
ça fait beaucoup ... mais tu traite déjà l'image puis tu veux compresser ça ?
A mon avis faut le faire en 2 temps, quoique ... à enregistrer ça fait un paquet de Mo /s ...
T'as essayer en xVid ?
Marsh Posté le 03-03-2004 à 09:54:55
je traite déjà l'image quand elle arrive sur le pc en utilisant directx pour les transformations (notemment passage du mode lineaire en polaire et lissage des pixels) mais en gros l'image fait 2Mo quand elle arrive sur le pc et je la compresse dans un format a moi similaire au jpeg.
En sachant aussi que je garde en mémoire 100 images qui me permettent de simuler un film. Le but c'est d'utiliser directx pour que ces images soient directement integrées à un avi donc compréssée en temps réel. si je me trompe pas ce n'est "qu'un" transformé de fourrier avec travail sur des matrices on doit bien pouvoir faire ca avec directx et les pixel ou vertex shader non????
L'idée c'est d'utiliser le gpu plutot que le cpu du pc qui me semble plus approprié pour travailler des images!
Marsh Posté le 03-03-2004 à 10:55:59
voilà ce que j'appellerai une réponse constructive!! lol
Je sais que ca parait pas super simple comme ca mais il me semble qu'il existe des encodeurs qui utilisent directx donc je me dit que ca doit etre possible! d'autant que travailler les matrices, directx et les cartes graph ne font que ca!!
Marsh Posté le 03-03-2004 à 11:08:16
Plus concretement, en quel format veux tu compresser ta video ? Est tu au courant des limitations des PS et des VS qui fait que c'est pratiquement impossible de faire ce que tu veux ? Et comment vas tu faire pour recuperer le resultat "calculé" par le GPU pour le stocker dans sur le disque de toute façon ?
Marsh Posté le 03-03-2004 à 11:09:27
axl63800 a écrit : voilà ce que j'appellerai une réponse constructive!! lol |
Ah?
AMHA ca va être difficile tout ça...j'admets que j'ai jamais fait de directX, mais à priori ce qui est dans la CG est fait pour partir à l'écran, pas pour retourner vers le cpu!
Bref, ton algo d'encodage n'est probablement pas optimal, donc à ta place je commencerais par là...
Marsh Posté le 03-03-2004 à 11:12:18
Et si tu fais des transformées de Fourier c'est pas les exemples de FFT qui devraient trop manquer sur le net...
Marsh Posté le 03-03-2004 à 11:20:23
bah tu peux faire un upload d'image => carte 3d => traitement pixelshader => download => compression avec un codec classique...
c'est possible...
mais si en local à la carte 3d, ta surface fait du 2048x..., je te conseillerai de la downsampler (par exemple avec un filtre dans un pixel shader) avant de la donner à manger à ton encodeur...
Marsh Posté le 03-03-2004 à 11:52:27
Citation : Plus concretement, en quel format veux tu compresser ta video ? Est tu au courant des limitations des PS et des VS qui fait que c'est pratiquement impossible de faire ce que tu veux ? |
En ce qui concerne le format je pensait à un avi
Pour les ps et vs je crois que dx9c permet de gerer un nombre d'instructions relativement sympatique
Citation : bah tu peux faire un upload d'image => carte 3d => traitement pixelshader => download => compression avec un codec classique... |
Et le gpu pourrait pas faire l'encodage avant de me renvoyer le flux d'images? un peu comme pourrait le faire un encodeur type enregistrement tps réel d'un logiciel d'aquisition tv?
Marsh Posté le 03-03-2004 à 11:55:58
Ca demande quand meme des calculs assez costauds ce que tu veux faire la. Tu disposes de quoi comme machine ?
M'enfin ca m'interesse quand meme pas mal toute cette histoire, alors
Marsh Posté le 03-03-2004 à 11:57:26
nope, à ma conaissance, le GPU n'a pas ce qu'il faut en ressources et en opérateurs pour encoder. (ou alors ça deviens du sport de très très haut niveau, et les performances de la chose risquent d'être bof)
ce qu'il peut te faire c'est des filtres sympas essentiellement, ou des effets...
Marsh Posté le 03-03-2004 à 11:59:39
Bon, sinon si tu tiens absolument à utiliser la CG pour faire le boulot du cpu tu peux tjrs regarder ça : http://graphics.stanford.edu/projects/brookgpu/
Marsh Posté le 03-03-2004 à 12:38:09
axl63800 a écrit :
|
Oui mais non, avi n'est pas un format de compression mais juste un encapsuleur de video. Par format je pensais plustot MPEG-2 ou MPEG-1 ou MPEG-4 ou ...
Marsh Posté le 03-03-2004 à 14:21:29
Le fait de passer par le GPU n'est pas une bonne idée, car les transferts sont lents. Quoique, ce qui est lent c'est l'écriture en mémoire video ( overlay) pour le reste faut peut-être voir ...
Sinon passer par une carte d'encodage en hardware, mais direct sur PCI.
Marsh Posté le 03-03-2004 à 14:25:07
Kristoph a écrit : |
ahh désolé je pense faire du mpeg 2 ou 4
Citation : Ca demande quand meme des calculs assez costauds ce que tu veux faire la. Tu disposes de quoi comme machine ? |
la machine qui sera requise sera de l'ordre du 2Ghz mini pour le proc et une carte graph directx 9 mini
Marsh Posté le 10-03-2004 à 18:43:56
Je vois plusieurs points...
0) Quel processeur (en dessous de 1Ghz, c'est douteux) et quel espace de developpement as-tu? Quel espace de couleur et quel debit souhaites-tu avoir?
1) Sélection de l'espace de couleurs. Il faut choisir entre fidélité à la source, temps de conversion (RGB->YUY2 par exemple) et réduction de la quantité d'information que doit traiter le codec que tu veux utiliser. Je ne sais pas si c'est faisable sous DirectShow, peut-être avec VfW, et surement ave du code optimisé sous license GPL (mplayer/ffmpeg, avisynth, ...)
2) Redimensionnement de l'image: tu peux utiliser des transformation DirectX pour ca (je pense), ou encore du code GPL
3) Pour l'encodage, tu peux aussi utiliser en partie VfW
Concernant VfW, tu peux commencer a regarder ca:
http://msdn.microsoft.com/library/ [...] aminfo.asp
Tel que je le vois, tu crees un premier compresseur qui va faire la conversion d'espace de couleur si necessaire (et si le codec ne supporte l'espace original, ou que tu souhaites un particulier parmi ceux que tu veux), un 2e pour la compression (la conversion d'espace de couleur pouvant etre assuree par le codec).
Tu as un buffer en entree, un en sortie. Tu recuperes les donnees de ce dernier pour le passer au compresseur suivant, ou tout simplement encapsuler les donnees dans un fichier de ton propre format (que tu as ptet deja cree).
Ca ne resoud pas ton probleme de redimensionnement ou de debruitage en temps réel, mais j'ai peu d'espoir pour que tu trouves un truc qui utilise autre chose que ton CPU.
Marsh Posté le 02-03-2004 à 16:46:47
Bon je resume je voudrais encoder en temps réel de la video grace à directx.
En gros j'ai un appareil qui m'envoie des images que je traite déjà grace aux pixel et vertex shader et je voudrais pour encoder ces images en temps réel car j'ai fait des test d'encodage et pour l'instant le meilleur compromis que j'ai pu faire c'est 6s/image!!
Il faut dire que mes image peuvent aller jusqu'a une résolution de 2048*512
Voilà donc si vous connaissez une source ou la methode pour faire cette opération merci d'avance!!
Je precise quand meme que je ne veux pas rajouter de cartes ou de module externe au pc!