2010-09-24 3 views
1

В дополнение к моему previous question, я могу сохранить backbuffer Direct3DDevice на поверхность.Direct3D: Запись в файлы AVI

Я уже нашел D3DXSaveSurfaceToFile в DirectX SDK, и он отлично работает! Однако я хочу записать полученные поверхности в файл AVI.

Я также нашел AVIFile reference, но они явно несовместимы с DirectX-поверхностями.

Что было бы лучшим способом приблизиться к этой проблеме? Я видел несколько решений на основе GDI +/MVC для захвата HDC, но об этом не может быть и речи. Я также не уверен, какие данные AVIFile ожидает и как извлечь из D3DSurface.

Обратите внимание! :)

редактировать:

Постобработка также вариант. Я могу захватить поверхностные данные в нескольких форматах, указанных here, в память с D3DXSaveSurfaceToFileInMemory. Впоследствии я мог бы сжать эти данные, а затем сохранить их на диск.

Как мне сжимать данные? Как его хранить? Сохраняю ли я временную метку вместе с ней? После записи, как мне преобразовать сгенерированные данные в файл AVI?

ответ

2

Исходный код по этой ссылке покажет вам, как это сделать:

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

Edit: Ну вы не должны делать вещи так же, как тот связанный код. У вас есть D3DSurface, поэтому вы можете просто заблокировать его, захватить биты и передать их в CAviFile :: AppendFrameUsual ... Если вы хотите изменить его формат, используйте D3DXLoadSurfaceFromSurfac e. Я не сказал, что ссылка была идеальным решением, но она показывает вам, как записывать кадры в AVi-файл.

Редактировать2: Поскольку я не ответил на ваши изменения, я должен был сделать. Во-первых, не мешайте сжатию, пока не получите несжатую работу. Сжатие является значительно более сложной задачей, чтобы получить право, и вы не сможете получить надлежащее сжатие, просто используя различные функции копирования D3DXSurface. Они не поддерживают типы сжатия, которые вы после. D3DX предназначен для 3D-рендеринга и НЕ для сжатия видео.

Для сжатия видео вам лучше всего использовать DirectShow, просто добавьте любые компрессоры, которые вы хотите. Это, однако, означает, что вам нужно будет написать «исходный фильтр», в котором вы можете построить свой график. DirectShow не просто использовать, но и очень мощно. Что касается записи «фильтра источника», вы можете проверить пример «Push Source» в SDK Windows. Вам нужно будет адаптировать его для получения данных, которые вы извлекаете.

Как в сторону, идя дальше в моем первоначальном редактировании, вы можете использовать этот код, как и перехватывать больше вызовов D3D9. Если вы подключаете вызовы SetRenderTarget, вы можете вставить туда любой желаемый объект рендеринга и использовать ранее связанный код ...

+0

Я посмотрел на это, и это связано с изменением цели рендеринга, а затем с копированием бэкбуффер. Это не возможность для меня, так как я просто подключаю API и не имею никакого контроля над исходным буфером. Я могу получить текущий backbuffer и накормить его что-то просто отлично. –

+0

Кроме того, он требует, чтобы я подключался к CreateDevice/Reset/etc, который я действительно не хочу делать (накладывал бы ограничения на то, когда я должен начать вводить/подключать). –

+0

@ Даниэль: Обновлен мой ответ. – Goz

Смежные вопросы