Программа для создания timelapse-видео
от aNNiMON
Интересно иногда просматривать вот такие видео. Для этого совсем не обязательно иметь цифровую камеру, достаточно будет компьютера с доступом в Интернет. Изображения можно брать из множества доступных по всему миру веб-камер, например: Париж, Лос-Анжелес, Великобритания.
Что будет делать программа? По введённой ссылке на веб-камеру она будет скачивать изображения раз в указанное количество секунд и добавлять их к видеопотоку, всё просто.
Для работы с видео будем использовать C# обёртку над библиотекой AviFile.
Создаём новый проект в Visual Studio, на полученную форму переносим TextBox для ввода URL веб-камеры, парочку NumericUpDown для настройки интервала и кнопку Start.
Кидаем в проект AviFile.dll (Проект->Существующий элемент) и добавляем его в ссылки (Проект->Добавить ссылку). В коде MainWindow.cs не забываем добавить строку "using AviFile;".
Для начала создадим таймер, который будет вызывать нужный нам метод через заданный промежуток времени.
Настраивать интервал будем при каждом старте, то есть при нажатии кнопки Start. Обработчик нажатия startStopButton:
Здесь добавлена логика изменения текста кнопки в соответствии с состоянием работы.
Теперь приступим к видео. Добавим два объекта, необходимых для работы, а также счетчик фреймов для наглядности:
Создание экземпляра класса AviManager поместим в обработчик нажатия кнопки Start:
При нажатии Stop нужно завершить работу менеджера:
Осталось написать добавление кадра в поток:
На этом всё.
Проект с программой
Пример полученного видео
Что будет делать программа? По введённой ссылке на веб-камеру она будет скачивать изображения раз в указанное количество секунд и добавлять их к видеопотоку, всё просто.
Для работы с видео будем использовать C# обёртку над библиотекой AviFile.
Создаём новый проект в Visual Studio, на полученную форму переносим TextBox для ввода URL веб-камеры, парочку NumericUpDown для настройки интервала и кнопку Start.
Кидаем в проект AviFile.dll (Проект->Существующий элемент) и добавляем его в ссылки (Проект->Добавить ссылку). В коде MainWindow.cs не забываем добавить строку "using AviFile;".
Для начала создадим таймер, который будет вызывать нужный нам метод через заданный промежуток времени.
- private Timer timer;
- public MainWindow() {
- InitializeComponent();
- timer = new Timer();
- timer.Tick += new EventHandler(timerTick);
- }
- private void timerTick(object sender, EventArgs e) { }
Настраивать интервал будем при каждом старте, то есть при нажатии кнопки Start. Обработчик нажатия startStopButton:
- private void startStopButton_Click(object sender, EventArgs e) {
- if (startStopButton.Text.Equals("Stop")) {
- startStopButton.Text = "Start";
- timer.Stop();
- } else {
- startStopButton.Text = "Stop";
- timer.Interval = (int) (intervalNumeric.Value * 1000);
- timer.Start();
- }
- }
Теперь приступим к видео. Добавим два объекта, необходимых для работы, а также счетчик фреймов для наглядности:
- private AviManager aviManager;
- private VideoStream aviStream;
- private static int frames = 0;
- startStopButton.Text = "Stop";
- frames = 0;
- framesLabel.Text = "Frames: " + frames;
- aviManager = new AviManager("D:\\" + DateTime.Now.ToString("yyyy_MM_dd__H_mm_ss") + ".avi", false);
- timer.Interval = (int) (intervalNumeric.Value * 1000);
- startStopButton.Text = "Start";
- timer.Stop();
- aviManager.Close();
Осталось написать добавление кадра в поток:
- private void timerTick(object sender, EventArgs e) {
- // Событие обновления таймера.
- if (startStopButton.Text.Equals("Start")) return;
- Bitmap bmp = getImageFromWeb(urlTextBox.Text);
- if (frames == 0) {
- // Создать видеопоток
- aviStream = aviManager.AddVideoStream(false, (double)framerateNumeric.Value, bmp);
- } else {
- aviStream.AddFrame(bmp);
- }
- bmp.Dispose();
- frames++;
- framesLabel.Text = "Frames: " + frames;
- }
- private Bitmap getImageFromWeb(String fromUrl) {
- Bitmap image;
- using (WebClient client = new WebClient()) {
- System.IO.Stream stream = client.OpenRead(fromUrl);
- image = new Bitmap(stream);
- stream.Close();
- }
- return image;
- }
На этом всё.
Проект с программой
Пример полученного видео