Настройте IWMWriter для записи видео 4K

Этот вопрос касается использования Window Media API для вывода видео 4K WMV (хотя теоретически WMV не поддерживает вывод в 4K)

После вызова IWMWriter->BeginWriting() как на 32-битной, так и на 64-битной Win10 (на обеих системах BeginWriting() возвращает S_OK), программа занимает около 450 МБ памяти.

После этого я начинаю использовать IWMWriter->AllocateSample() для выделения буфера сэмпла и записи его в сток с помощью IWMWriter->WriteSample().

В 64-битной Win10 преобразование может завершиться изящно, но в 32-битной Win10 WriteSample() завершается с ошибкой «недостаточно памяти» после записи нескольких кадров.

Единственная разница, которую я вижу в двух системах, заключается в следующем: перед вызовом BeginWriting() 64Win10 занимает 110 МБ памяти, поэтому после вызова BeginWriting() используется 110+450. В 32-битной Win10 перед BeginWriting() используется 150 МБ, поэтому после этого используется 150+450.

Пиковый рабочий набор неудачного преобразования составляет всего 761 МБ, кто-нибудь знает, почему в этом случае WriteSample() возвращает нехватку памяти. Есть ли обходной путь для этого?

== Обновление: ============================================

Исходное видео содержит и видео, и аудио, в случае сбоя программа записывает и видео, и аудио, но записать видео не удалось.

Если я уберу звуковую дорожку из файла, чтобы она содержала только видео, преобразование может завершиться изящно. Пиковый рабочий набор составляет 716 МБ.


person rhbc73    schedule 11.08.2016    source источник


Ответы (1)


Дело в требованиях видеокодера к памяти: при таком разрешении приложение не умещается в стандартные 2 ГБ адресного пространства 32-битного приложения. Вы можете связать с /LARGEADDRESSAWARE, чтобы избежать нехватки памяти.

person Roman R.    schedule 11.08.2016
comment
Спасибо за предложение Роман. Но поддержка больших адресов уже включена. Тот же образец программы также правильно работает в 32-разрядной системе Win7. - person rhbc73; 15.08.2016
comment
Ваш код как есть вызывает нарушение прав доступа при вызове BeginWriting в моей системе как в 32-битной, так и в 64-битной версиях. Однако перед установкой /LARGEADDRESSAWARE 32-битная версия действительно перешла в состояние нехватки памяти. Так что я все еще думаю, что это проблема для 32 бит и высокого разрешения. Кодировщик Win 7 может быть менее требовательным к памяти и работать сразу. - person Roman R.; 15.08.2016
comment
Спасибо Роман. Эта проблема несколько решена. Как я уже сказал, у меня не хватает памяти, когда вызывается BeginWriting. Это потому, что я неправильно указал тип носителя memset. memset(p, size, value) был записан в memset(p, value, size) при установке входных свойств. - person rhbc73; 16.08.2016
comment
С правильно написанным memset на моей 32-битной машине Win10 после вызова BeginWriting() программа заняла около 450 МБ. Еще одна ошибка, которую я сделал, заключается в том, что потребление памяти после вызова BeginWriting() на 64-битной Win10 также составляет 450 МБ. Таким образом, поведение на 32-битных и 64-битных системах одинаково. - person rhbc73; 16.08.2016