Создание видео, кадр за кадром, из .Net - PullRequest
1 голос
/ 28 мая 2009

У меня есть приложение .Net, которое визуализирует графику с использованием GDI + и / или XNA, и я хочу записывать кадры непосредственно в видео (предпочтительно AVI, где я могу включить кодек, такой как xvid и т. Д.). Я перепробовал многие решения, и столкнулся со стоп-шоу со всеми из них.

Кажется, что все библиотеки, основанные на FFMPeg, предназначены для перекодирования существующего потока, а не для генерации нового из кадров.

Существует библиотека .Net под названием Splicer для codeplex, но, насколько я могу судить, она больше ориентирована на создание «слайд-шоу», поскольку она берет каждый кадр и сохраняет его на HD. Решения DirectShow ведут себя одинаково.

Затем есть обертка AVIFile, которая почти то, что мне нужно. Единственная проблема заключается в том, что при запуске новой кодировки появляется (а иногда и ПОД !?) диалоговое окно. Диалог не является проблемой для обычного использования, но мне также нужно, чтобы он работал как служба, поэтому обязательный пользовательский интерфейс, очевидно, является ограничителем показа.

Кто-нибудь знает другой вариант, который относительно .Net дружественный, или я просто слишком много спрашиваю?

Ответы [ 4 ]

1 голос
/ 16 августа 2009

Если вы все еще хотите использовать ffmpeg, запишите кадры на диск и используйте что-то вроде

ffmpeg -f image2 -i foo-% 03d.jpeg -r 12 -s WxH foo.avi

Синтаксис foo-% 03d.jpeg определяет использование десятичного числа, состоящего из трех цифр, дополненных нулями, для выражения порядкового номера. Это тот же синтаксис, который поддерживается функцией C printf, но подходят только форматы, принимающие нормальное целое число.

-r 12 указывает 12 кадров в секунду

-s WxH должен указывать ширину и высоту

Это из документации ffmpeg .

1 голос
/ 28 мая 2009

Проверьте этот вопрос на форумах XNA, чтобы узнать, что вы хотите сделать в XNA. В частности, этот ответ от ZMan:

"В XNA нет ничего, что могло бы вам помочь здесь - нужно смотреть на других Windows API. Вы бы использовали XNA для захватить задний буфер и затем сохранить каждый кадр, но есть много вещей быть обеспокоенным. Тянет каждый кадр из заднего буфера мгновенно создает некоторую задержку, сжимая изображения (если вы решили сжать на муха) сильно загружает процессор, сохраняя файл добавляет задержку.

DirectShow - это один API, который вы можете использовать для сделать сжатие - есть много другие. Выкл. / MP4 и т. Д. Запись звука есть DSound и я думаю, что DShow может использовать DSound, чтобы захватить аудио выход тоже. Это довольно специализированные API, поэтому вы Возможно, вы захотите найти другие форумы. "

1 голос
/ 16 августа 2009

На самом деле Splicer может создавать плавные видео из нескольких неподвижных кадров, вам просто нужно убедиться, что вы установили соответствующее смещение клипа и параметры конца клипа при вызове ITrack.AddFrame. В моей программе я использую:

videoTrack.AddImage(buffer, 0, 1f / FramesPerSecond);

, откуда videoTrack взято:

timeline = new DefaultTimeline(framesPerSecond);
videoGroup = timeline.AddVideoGroup("main", framesPerSecond, 24, width, height);
videoTrack = videoGroup.AddTrack();

в конструкторе моего видеоэкспортера для программы моделирования, над которой я работаю.

1 голос
/ 28 мая 2009

Я не знаю, какую оболочку AVIFile вы используете, но я полагаю, что AviFile, вероятно, вызывает AVISaveOptions для получения инициализированной структуры AVICOMPRESSOPTIONS. Вы можете просто инициализировать AVICOMPRESSOPTIONS самостоятельно. Большинство участников AVICOMPRESSOPTIONS довольно просты. lpParms и cbParms содержат блок (cbParms = длина блока) данных конфигурации двоичного кодека. Вы можете получить эти данные, вызвав ICGetState.

Это должно быть довольно простое изменение в вашем родном AVIFile, и ваша обертка все еще должна работать.

Посмотрите на этот образец , чтобы узнать, как запускать AVICOMPRESSOPTIONS.

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