Pregunta

En seguimiento a mi pregunta anterior , soy capaz de guardar la backbuffer de un Direct3DDevice a una superficie.

Ya he encontrado la D3DXSaveSurfaceToFile en el SDK de DirectX y funciona bien! Sin embargo, quiero dejar constancia de las superficies obtenidas en un archivo AVI.

También encontró el avifile referencia pero es evidente que no son directamente hacia arriba compatible con DirectX superficies.

¿Cuál sería la mejor manera de abordar este problema? He visto una serie de soluciones basadas en GDI + / MVC de agarrar HDC pero esas son fuera de la cuestión. Yo también estoy seguro qué tipo de datos avifile Espera y cómo extraerlo del D3DSurface.

Por favor, asesorar! :)

editar

Post-procesamiento es también una opción. Puedo capturar los datos de superficie en una serie de formatos, se especifica aquí , en memoria con D3DXSaveSurfaceToFileInMemory . Posteriormente, podría comprimir estos datos y almacenarlos en el disco.

¿Cómo debería ser la compresión de los datos? ¿Cómo debería ser almacenarlo? Cómo guardo una marca de tiempo junto con él? Después de grabar, cómo hay que acudir a los datos generados en un archivo AVI?

¿Fue útil?

Solución

El código fuente en esta liga te va a mostrar cómo hacerlo:

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

Editar : Bueno, no tiene que hacer las cosas exactamente igual que el código relacionado. Usted tiene un D3DSurface por lo que sólo puede bloquearlo agarrar los bits y los pasa en CAviFile :: AppendFrameUsual ... Si desea cambiar su formato a continuación, utilizar D3DXLoadSurfaceFromSurfac correo. No dije que el enlace era una solución perfecta, pero que sí muestra cómo escribir los marcos en un archivo AVI.

Edit2 : Como no contesté tu edición que debería hacer. En primer lugar no se moleste con la compresión hasta que haya conseguido trabajo sin comprimir. La compresión es una cosa mucho más complicado para hacerlo bien y no será capaz de obtener la compresión adecuada por el simple uso de las distintas funciones D3DXSurface copiar. Ellos no son compatibles con el tipo de compresión que está después. D3DX es para el procesamiento 3D y NO para la compresión de vídeo.

Para la compresión de vídeo que es el mejor de usar DirectShow como se puede, simplemente, añadir ningún tipo de compresor que usted desee. Sin embargo, esto significará que tendrá que escribir un "filtro de origen" que se puede construir la gráfica fuera. DirectShow no es una cosa fácil de usar, pero su muy potente. En cuanto a la redacción del "filtro de origen" se puede comprobar a cabo el ejemplo "Push Fuente" en el SDK de Windows. Usted tendrá que adaptarla a los datos que se está recuperando sin embargo.

Como acotación al margen, yendo más allá de mi edición original que podría utilizar ese código al igual que mediante la interceptación de llamadas más D3D9. Si conecta las llamadas SetRenderTarget entonces se puede insertar lo que hacen como objetivo allí y utilizar el, código anteriormente, unido directamente ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top