IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Modifier le codage des pixels pour capture vidéo


Sujet :

DirectX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut Modifier le codage des pixels pour capture vidéo
    Bonjour, voila mon probleme, je réalise un jeu avec DX9 et j'ai besoin d'y inclure un systeme pour enregister des videos des phase de jeu.
    J'ai donc pris comme base une source de création de fichier AVI à partir de bitmap que j'ai modifié pour pouvoir mettre le jeu a la place des BMP.

    Le probleme c'est que la création de chaque frame de la video nécessite un buffer de la forme RedGreenBlueR.G.B.R.G.B.R.G.B... avec un octet par couleur soit 3octets pour chaque pixel, mais le buffer de mon jeu contient lui une couleur alpha en plus et l'ordre est inversé ce qui donne AlphaRedGreenBlueA.R.G.B.A.R.G.B.A.R.G.B.... avec 4 octet par pixel et l'ordre est inversé en fait c'est B.G.R.A.B.G.R.A.B.G.R.A...

    J'ai essayé de faire une boucle qui reprend chaque pixel supprime l'alpha et inverse l'ordre des couleurs mais c'est beaucoup trop lent.
    Donc je voudrais savoir si on peut faire ca de maniere plus rapide faire ca d'un coup au lieu de modifier chaque pixel.
    Merci d'avance j'ai vraiment besoin d'une solution.


    [Titre modifié par Loulou24, merci d'utiliser des titres explicites à l'avenir]

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu peux toujours changer le format de pixel avec les fonctions de DirectX (D3DXLoadSurfaceFromSurface) et ainsi faire les conversions avec le driver, mais je ne sais pas si ce sera beaucoup plus rapide.

    Sinon, il est aussi possible de capturer directement le contenu de la fenêtre via les fonctions Win32. J'ai un code qui traine (je l'utilise pour les videos dans mes jeux), si jamais ça t'intéresse.

    Bien sûr si tu ne veux pas réinventer la roue, tu peux aussi utiliser un outil existant, par exemple FRAPS.

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Tu peux aussi utiliser directshow (certains codecs sont optimisés en assembleur et utilisent les instructions spécialisées du processeur).

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    Comment changer le format de pixel avec D3DXLoadSurfaceFromSurface ?
    Dans msdn ils n'en disent pas vriment plus que ca...

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    D3DXLoadSurfaceFromSurface permet de copier le contenu d'une surface dans une autre, en gérant la conversion de pixel et le redimensionnement si nécessaire. Tout ce que tu as à faire est donc de créer une surface avec le format de pixel désiré, et de copier ton ancienne dedans via cette fonction.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    Bon voila ce que j'ai fait par rapport a un code que j'ai trouvé je l'ai adapté pour DX9 :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    	LPDIRECT3DSURFACE9 pSurface;
    	m_pd3dDevice->GetBackBuffer( 0,0, D3DBACKBUFFER_TYPE_MONO, &pSurface );
     
    	/* Get the back buffer description. */
    	D3DSURFACE_DESC desc;
    	pSurface->GetDesc( &desc );
     
    	/* Copy the back buffer into a surface of a type we support. */
    	LPDIRECT3DSURFACE9 pCopy;
    	m_pd3dDevice->CreateOffscreenPlainSurface( desc.Width, desc.Height, D3DFMT_R8G8B8, D3DPOOL_DEFAULT, &pCopy ,NULL);
     
    	D3DXLoadSurfaceFromSurface( pCopy, NULL, NULL, pSurface, NULL, NULL, D3DX_DEFAULT, 0 );
     
    	pSurface->Release();
     
    	/* Update desc from the copy. */
    	pCopy->GetDesc( &desc );
    Mais ca bug sur la derniere ligne (Getdesc) j'ai essayé de le viré et dans ce cas ca bug plus loin quand je lock pCopy pour la lire.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Commence par vérifier tous les retours de tes fonctions. Ensuite utilise le debug de DirectX. Enfin si tu n'as toujours pas trouvé l'erreur, essaye avec le reference rasterizer.

    A priori ça peut venir de beaucoup de choses : mauvaise dimension, mauvais flag, mauvais pool, mauvais format de pixel, ... il y a tellement d'incompatibilités à gérer avec DirectX, qu'on a vite fait de faire une erreur.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    Bon apparemment quand je mais A8R8G8B8 ca marche mais pas quand je met R8G8B8 ca marche plus donc c'est pas cool.
    Par contre j'ai trouvé sur msdn une fonction qui résoudrais surement mon probleme c'est D3DXSaveSurfaceToFileInMemory() qui serait déclaré dans d3dx9tex.h mais la réalité c'est qu'elle n'y est pas dans ce fichier donc j'ai un "undeclared identifier" comment est-ce possible???

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Bon apparemment quand je mais A8R8G8B8 ca marche mais pas quand je met R8G8B8 ca marche plus donc c'est pas cool
    Le format R8G8B8 est a ce que j'ai constaté rarement supporté. Essaye tout de même en créant ta surface en mémoire système, sait-on jamais.

    Par contre j'ai trouvé sur msdn une fonction qui résoudrais surement mon probleme c'est D3DXSaveSurfaceToFileInMemory()
    Ca ne résoudra pas ton problème : cela créera un fichier en mémoire, et non un simple tableau de pixels. De plus je doute que ce soit une solution performante dans le contexte actuel.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    Si la fonction D3DXSaveSurfaceToFileInMemory créera un buffer équivalent à un fichier bmp hors un fichier bmp sauvegarde les couleur sous forme RGB sans alpha donc ca devrai etre bon j'aurai juste à passer l'entete bmp s'il cette fonction la crée.
    Pour les performances faut tester.
    Par contre ce que je ne comprend pas c'est que cette fonction ne semble pas exister ou alors dans un autre .h
    MSDN contiendrait elle une erreur?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Points : 82
    Points
    82
    Par défaut
    Merci pour votre aide finalement j'ai fini par trouver une solution a laquelle j'aurai du pensé avant.
    En fait je pensais qu'un fichier BMP était limité aux valeur RGB et j'ai découvert qu'on peut créer un BMP format 32bits soit ARGB exactement ce qu'il me fallait je peux donc enfin capturer mes jeu en video

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/08/2008, 16h24
  2. [CP] Des pistes pour capturer des évènements stylet
    Par guipom dans le forum Windows Mobile
    Réponses: 1
    Dernier message: 05/06/2007, 16h12
  3. Afficher des pixels pour dessiner une fonction
    Par Sandro Munda dans le forum Linux
    Réponses: 7
    Dernier message: 13/05/2007, 11h58
  4. [FLASH 8] Télécharger des skins pour la vidéo?
    Par bractar dans le forum Flash
    Réponses: 5
    Dernier message: 11/01/2006, 15h08
  5. Comment faire des menus pour DVD-vidéo
    Par BigBenQ dans le forum Vidéo
    Réponses: 3
    Dernier message: 21/11/2005, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo