Исходный код по этой ссылке покажет вам, как это сделать:
http://gpalem.web.officelive.com/SimulationRecording.html
Редактировать : Ну, вам не нужно делать такие вещи, как этот связанный код. У вас есть D3DSurface, так что вы можете просто заблокировать его, захватить биты и передать их в CAviFile :: AppendFrameUsual ... Если вы хотите изменить его формат, используйте D3DXLoadSurfaceFromSurfac e. Я не говорил, что ссылка была идеальным решением, но она показывает, как записать кадры в файл AVi.
Edit2 : Поскольку я не ответил на ваши изменения, я должен был это сделать. Во-первых, не беспокойтесь о сжатии, пока не получите несжатую работу. Сжатие - это значительно более сложная вещь, чтобы понять ее правильно, и вы не сможете получить надлежащее сжатие, просто используя различные функции копирования D3DXSurface. Они не поддерживают те виды сжатия, которые вам нужны. D3DX предназначен для 3D-рендеринга, а НЕ для сжатия видео.
Для сжатия видео лучше всего использовать DirectShow, так как вы можете просто добавить любые компрессоры, какие пожелаете. Это, однако, будет означать, что вам нужно написать «исходный фильтр», из которого вы можете построить свой график. DirectShow не простая в использовании вещь, но очень мощная. Что касается написания «исходного фильтра», вы можете проверить пример «Push Source» в Windows SDK. Однако вам нужно будет адаптировать его для получения данных, которые вы извлекаете.
В качестве продолжения, перейдя дальше к моему первоначальному редактированию, вы можете использовать этот код как есть, перехватывая больше вызовов D3D9. Если вы перехватываете вызовы SetRenderTarget, вы можете вставить туда любую цель рендеринга и использовать ранее связанный код ...