Программа для создания timelapse-видео

от
Прочие языки    csharp, .net, timelapse, video

Интересно иногда просматривать вот такие видео. Для этого совсем не обязательно иметь цифровую камеру, достаточно будет компьютера с доступом в Интернет. Изображения можно брать из множества доступных по всему миру веб-камер, например: Париж, Лос-Анжелес, Великобритания.

Что будет делать программа? По введённой ссылке на веб-камеру она будет скачивать изображения раз в указанное количество секунд и добавлять их к видеопотоку, всё просто.

Для работы с видео будем использовать C# обёртку над библиотекой AviFile.

Создаём новый проект в Visual Studio, на полученную форму переносим TextBox для ввода URL веб-камеры, парочку NumericUpDown для настройки интервала и кнопку Start.
  timelapse_1.png
Кидаем в проект AviFile.dll (Проект->Существующий элемент) и добавляем его в ссылки (Проект->Добавить ссылку). В коде MainWindow.cs не забываем добавить строку "using AviFile;".

Для начала создадим таймер, который будет вызывать нужный нам метод через заданный промежуток времени.
  1. private Timer timer;
  2.  
  3. public MainWindow() {
  4.     InitializeComponent();
  5.     timer = new Timer();
  6.     timer.Tick += new EventHandler(timerTick);
  7. }
  8.  
  9. private void timerTick(object sender, EventArgs e) { }

Настраивать интервал будем при каждом старте, то есть при нажатии кнопки Start. Обработчик нажатия startStopButton:
  1. private void startStopButton_Click(object sender, EventArgs e) {
  2.     if (startStopButton.Text.Equals("Stop")) {
  3.         startStopButton.Text = "Start";
  4.         timer.Stop();
  5.     } else {
  6.         startStopButton.Text = "Stop";
  7.  
  8.         timer.Interval = (int) (intervalNumeric.Value * 1000);
  9.         timer.Start();
  10.     }
  11. }
Здесь добавлена логика изменения текста кнопки в соответствии с состоянием работы.

Теперь приступим к видео. Добавим два объекта, необходимых для работы, а также счетчик фреймов для наглядности:
  1. private AviManager aviManager;
  2. private VideoStream aviStream;
  3. private static int frames = 0;
Создание экземпляра класса AviManager поместим в обработчик нажатия кнопки Start:
  1. startStopButton.Text = "Stop";
  2. frames = 0;
  3. framesLabel.Text = "Frames: " + frames;
  4. aviManager = new AviManager("D:\\" + DateTime.Now.ToString("yyyy_MM_dd__H_mm_ss") + ".avi", false);
  5. timer.Interval = (int) (intervalNumeric.Value * 1000);
При нажатии Stop нужно завершить работу менеджера:
  1. startStopButton.Text = "Start";
  2. timer.Stop();
  3. aviManager.Close();

Осталось написать добавление кадра в поток:
  1. private void timerTick(object sender, EventArgs e) {
  2.     // Событие обновления таймера.
  3.     if (startStopButton.Text.Equals("Start")) return;
  4.  
  5.     Bitmap bmp = getImageFromWeb(urlTextBox.Text);
  6.     if (frames == 0) {
  7.         // Создать видеопоток
  8.         aviStream = aviManager.AddVideoStream(false, (double)framerateNumeric.Value, bmp);
  9.     } else {
  10.         aviStream.AddFrame(bmp);
  11.     }
  12.     bmp.Dispose();
  13.  
  14.     frames++;
  15.     framesLabel.Text = "Frames: " + frames;
  16. }
  17.  
  18. private Bitmap getImageFromWeb(String fromUrl) {
  19.     Bitmap image;
  20.     using (WebClient client = new WebClient()) {
  21.         System.IO.Stream stream = client.OpenRead(fromUrl);
  22.         image = new Bitmap(stream);
  23.         stream.Close();
  24.     }
  25.     return image;
  26. }

На этом всё.
Проект с программой
Пример полученного видео
  • +2
  • views 9519