2010-09-24 28 views
1

Suite à mon previous question, je peux sauvegarder le backbuffer d'un Direct3DDevice sur une surface.Direct3D: Enregistrement dans des fichiers AVI

J'ai déjà trouvé le D3DXSaveSurfaceToFile dans le SDK DirectX et ça marche très bien! Cependant, je veux enregistrer les surfaces obtenues dans un fichier AVI.

J'ai également trouvé le AVIFile reference mais ils ne sont évidemment pas directement compatibles avec les surfaces DirectX.

Quelle serait la meilleure façon d'aborder ce problème? J'ai vu un certain nombre de solutions basées sur GDI +/MVC de grabbing HDCs, mais ceux-ci sont hors de question. Je ne sais pas non plus quel type de données AVIFile attend et comment l'extraire de la D3DSurface.

S'il vous plaît aviser! :)

modifier:

post-traitement est également une option. Je peux capturer les données de surface dans un certain nombre de formats, spécifié here, en mémoire avec D3DXSaveSurfaceToFileInMemory. Ensuite, je pourrais compresser ces données et les stocker sur le disque.

Comment compresser mes données? Comment dois-je le stocker? Est-ce que je stocke un horodatage avec? Après l'enregistrement, comment dois-je transformer les données générées dans un fichier AVI?

Répondre

2

Le code source à ce lien va vous montrer comment le faire:

http://gpalem.web.officelive.com/SimulationRecording.html

Modifier: Eh bien, vous ne devez pas faire les choses exactement comme ce code lié. Vous avez une D3DSurface donc vous pouvez juste le verrouiller attraper les bits et les passer dans CAviFile :: AppendFrameUsual ... Si vous voulez changer son format, alors utilisez D3DXLoadSurfaceFromSurfac e. Je n'ai pas dit que le lien était une solution parfaite mais il vous montre comment écrire les images dans un fichier AVi.

Éditer2: Comme je n'ai pas répondu à votre édition je devrais faire. Premièrement, ne vous embêtez pas avec la compression tant que vous n'avez pas décompressé. La compression est une chose beaucoup plus compliquée à obtenir et vous ne serez pas capable d'obtenir une compression correcte en utilisant simplement les diverses fonctions de copie D3DXSurface. Ils ne supportent pas les types de compression que vous recherchez. D3DX est pour le rendu 3D et PAS pour la compression vidéo. Pour la compression vidéo, il vaut mieux utiliser DirectShow que vous pouvez, simplement, ajouter les compresseurs que vous souhaitez. Cela signifie cependant que vous devrez écrire un "filtre source" que vous pouvez créer votre graphique. DirectShow n'est pas une chose facile à utiliser mais c'est très puissant. En ce qui concerne l'écriture du "filtre source", vous pouvez consulter l'exemple "Push Source" dans le Windows SDK. Vous devrez l'adapter pour prendre les données que vous récupérez cependant. En outre, en allant plus loin sur mon édition originale, vous pouvez utiliser ce code tel quel en interceptant plus d'appels D3D9. Si vous connectez les appels SetRenderTarget, vous pouvez insérer la cible de rendu souhaitée et utiliser directement le code précédemment lié ...

+0

J'ai regardé ceci et cela implique de changer la cible de rendu, puis de recopier le backbuffer. Ce n'est pas une possibilité pour moi, car je ne fais que croquer les API et je n'ai aucun contrôle sur le backbuffer d'origine. Je peux obtenir le backbuffer actuel et le nourrir à quelque chose de très bien cependant. –

+0

En outre, il faut que je me connecte à CreateDevice/Reset/etc, ce que je ne veux pas vraiment faire (mettre des restrictions sur quand je devrais commencer à injecter/hooker). –

+0

@Daniel: Mise à jour ma réponse. – Goz