Что ж, этот ответ приходит с некоторым опозданием, но, поскольку в последнее время я заметил некоторую активность с моим первоначальным вопросом (и тот факт, что не было предоставлено работающего решения), я хотел бы рассказать вам, что в конечном итоге мне помогло. 1001 *
Я разделю свой ответ на три части:
Фон
(этот раздел не важен для решения)
Моя первоначальная проблема заключалась в том, что у меня было много изображений (то есть огромное количество), изображений, которые индивидуально сохранялись в базе данных в виде байтовых массивов. Я хотел сделать видеопоследовательность со всеми этими изображениями.
Мои настройки оборудования были примерно такими:
![enter image description here](https://i.stack.imgur.com/ej3Qd.jpg)
На изображениях изображено выращивание томатов в разных штатах. Все снимки делались каждую 1 минуту в дневное время.
/*pseudo code for taking and storing images*/
while (true)
{
if (daylight)
{
//get an image from the camera
//store the image as byte array to db
}
//wait 1 min
}
У меня была очень простая база данных для хранения изображений, в ней была только одна таблица (таблица ImageSet):
![enter image description here](https://i.stack.imgur.com/m4xrB.png)
Проблема
Я прочитал много статей о ffmpeg (см. Мой оригинальный вопрос), но не смог найти ни одного способа перехода от коллекции изображений к видео.
Решение
Наконец-то я получил рабочее решение!
Основная его часть взята из проекта с открытым исходным кодом AForge.NET . Короче говоря, можно сказать, что AForge.NET - это библиотека компьютерного зрения и искусственного интеллекта в C # .
(Если вам нужна копия фреймворка, просто возьмите ее с http://www.aforgenet.com/)
В AForge.NET есть этот класс VideoFileWriter (класс для записи видеофайлов с помощью ffmpeg). Это сделало почти всю работу. (Здесь также есть очень хороший пример )
Это последний класс (сокращенный), который я использовал для извлечения и преобразования данных изображения в видео из моей базы данных изображений:
public class MovieMaker
{
public void Start()
{
var startDate = DateTime.Parse("12 Mar 2012");
var endDate = DateTime.Parse("13 Aug 2012");
CreateMovie(startDate, endDate);
}
/*THIS CODE BLOCK IS COPIED*/
public Bitmap ToBitmap(byte[] byteArrayIn)
{
var ms = new System.IO.MemoryStream(byteArrayIn);
var returnImage = System.Drawing.Image.FromStream(ms);
var bitmap = new System.Drawing.Bitmap(returnImage);
return bitmap;
}
public Bitmap ReduceBitmap(Bitmap original, int reducedWidth, int reducedHeight)
{
var reduced = new Bitmap(reducedWidth, reducedHeight);
using (var dc = Graphics.FromImage(reduced))
{
// you might want to change properties like
dc.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
dc.DrawImage(original, new Rectangle(0, 0, reducedWidth, reducedHeight), new Rectangle(0, 0, original.Width, original.Height), GraphicsUnit.Pixel);
}
return reduced;
}
/*END OF COPIED CODE BLOCK*/
private void CreateMovie(DateTime startDate, DateTime endDate)
{
int width = 320;
int height = 240;
var framRate = 200;
using (var container = new ImageEntitiesContainer())
{
//a LINQ-query for getting the desired images
var query = from d in container.ImageSet
where d.Date >= startDate && d.Date <= endDate
select d;
// create instance of video writer
using (var vFWriter = new VideoFileWriter())
{
// create new video file
vFWriter.Open("nameOfMyVideoFile.avi", width, height, framRate, VideoCodec.Raw);
var imageEntities = query.ToList();
//loop throught all images in the collection
foreach (var imageEntity in imageEntities)
{
//what's the current image data?
var imageByteArray = imageEntity.Data;
var bmp = ToBitmap(imageByteArray);
var bmpReduced = ReduceBitmap(bmp, width, height);
vFWriter.WriteVideoFrame(bmpReduced);
}
vFWriter.Close();
}
}
}
}
Обновление 2013-11-29 (как это сделать) (надеюсь, это то, что вы просили @Kiquenet?)
- Загрузите AForge.NET Framework со страницы загрузки (Загрузите полный ZIP-архив, и вы найдете множество интересных решений Visual Studio с проектами, такими как Video, в
AForge.NET Framework-2.2.5\Samples folder
...)
- Пространство имен:
AForge.Video.FFMPEG
(из документации )
- Сборка:
AForge.Video.FFMPEG
(в AForge.Video.FFMPEG.dll
) (из документации ) (вы можете найти этот AForge.Video.FFMPEG.dll
в папке AForge.NET Framework-2.2.5\Release
)
Если вы хотите создать собственное решение , убедитесь, что в вашем проекте есть ссылка на AForge.Video.FFMPEG.dll
. Тогда должно быть легко использовать класс VideoFileWriter . Если вы перейдете по ссылке к классу, вы найдете очень хороший (и простой пример). В коде они подают VideoFileWriter с Bitmap image
в for
-loop