С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 09.12.2014
Сообщений: 6

Видеопоток с задержкой

20.05.2016, 14:45. Показов 852. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Уважаемые форумчане!
Есть задача: написать приложение с задержкой видеопотока в n минут(я сохраняю фреймы 25f/min), при каком либо событии(напр. button_click) сохранить этот поток в видео файл. Например: нажимаем на кнопку и видео с прошедшей минутой сохраняется в avi.
Использую C# WPF, AForge.
Проблема заключается в выборе буфера задержки, Bitmap конвертирую и храню его в массиве байт(принцип FILO), но этот массив занимает много места в оперативке( в 1-ну минуту процесс весит ~ 400 Мб)...
Есть мысль записывать в какой нибудь файл, потом с него читать. В инете нашел как записывать массив в файл, но мне надо записывать в файл и при новом фрейме (если буфер заполнен необходимым количеством фреймов) перезаписывать последний.
Первый кушает оперу, второй будет постоянно обращаться к HDD. Какой метод хранения буфера будет работать лучше?
Я надеюсь что свою проблему внятно объяснил
Помогите пожалуйста!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.05.2016, 14:45
Ответы с готовыми решениями:

Видеопоток
Добрый день. Пришла моя пора делать дипломный проект, а с ним появились вопросы. Моя задача принимать на вход видео с веб-камеры и...

Видеопоток с DVR.
Привет народ... Есть такая проблемма, может кто сталкивался... Китайский видеорегистратор с веб интерфейсом... Веб интерфейс...

STM32F7 и входящий видеопоток
Доброго времени суток, Хотел поинтересоваться у форумчан, может кто работал с видео. Вопрос в следующем: есть видеопоток (VGA/HDMI) -...

4
0 / 0 / 0
Регистрация: 09.12.2014
Сообщений: 6
24.05.2016, 11:07  [ТС]
Хоть кто-то дайте совет, совсем потерялся... как лучше сделать?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
24.05.2016, 11:52
egorchech, Объясните задачу более подробно.
Откуда берется входной поток? В каком он формате? Почему нельзя хранить сам входной поток?
Почему бы просто не сохранять входной поток в видео-файл, что бы потом можно было бы его просмотреть?
Приведите пример ваших наработок (лучше целиком работающий проект).
Цитата Сообщение от egorchech Посмотреть сообщение
Первый кушает оперу, второй будет постоянно обращаться к HDD.
А разве может быть как-то по-другому?
0
0 / 0 / 0
Регистрация: 09.12.2014
Сообщений: 6
25.05.2016, 11:37  [ТС]
Спасибо за ответ!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using System.Windows;
using System.Windows.Media.Imaging;
using AForge.Video.DirectShow;
using AForge.Video;
using AForge.Video.VFW;
using System.Drawing;
using AForge.Video.FFMPEG;
using System.Collections.Generic;
using System.Collections;
using System.Windows.Media;
using System.Threading;
using System.IO;
using System.Drawing.Imaging;
using System.Windows.Threading;
using System.IO.Compression;
 
namespace FaceCapture
{
    public partial class MainWindow : Window
    {
 
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
            proccessBarBuffer.Maximum = sizeBuffer;
            proccessBarSave.Maximum = sizeBuffer;
            System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();
 
        }
 
        FilterInfoCollection videosources = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        public static int sizeBuffer = 5000;
        private byte[][] bufferFramesByte = new byte[sizeBuffer][];
        public int iter, iterName = 0, widt, heig;
        public Bitmap image;
        public Thread myThread;
        public MemoryStream imageStream;
        VideoCaptureDevice videoSource;
        
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            videoSource = new VideoCaptureDevice(videosources[0].MonikerString);
            videoSourcePlayer.VideoSource = videoSource;
            videoSourcePlayer.Start();
            videoSource.Start();
            videoSource.NewFrame += new NewFrameEventHandler(videoSourcePlayer_NewFrame);
        }
 
 
        private void videoSourcePlayer_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            image = (Bitmap)eventArgs.Frame;
            if (iter >= sizeBuffer) iter = 0;
            widt = image.Size.Width;
            heig = image.Size.Height;
            if (bufferFramesByte[iter] != null) bufferFramesByte[iter] = null;
            byte[] byt = new byte[0];
            imageStream = new MemoryStream();
            image.Save(imageStream, ImageFormat.Jpeg); 
            imageStream.Close();
            byt = imageStream.ToArray();
            bufferFramesByte[iter++] = byt;
            imageStream.Dispose();
        }
 
 
        private void Button_Click_4(object sender, RoutedEventArgs e) // stop
        {
            SaveVideothread counter = new SaveVideothread();
            counter.bufferFramesBytes = bufferFramesByte;
            counter.iterName = iterName++;
            counter.iter = iter;
            counter.imageWidth = widt;
            counter.imageHeight = heig;
            myThread = new Thread(new ParameterizedThreadStart(SaveVideoToHDD));
            myThread.Start(counter);
        }
 
 
        public class SaveVideothread
        {
            public byte[][] bufferFramesBytes = new byte[MainWindow.sizeBuffer][];
            public int iterName, iter, imageWidth, imageHeight;
        }
 
        public  void SaveVideoToHDD(object obj)
        {
            SaveVideothread saveVideo = (SaveVideothread)obj;
            VideoFileWriter videoFileWriter = new VideoFileWriter();
 
            videoFileWriter.Open("D:\\AVITest\\test_" + saveVideo.iterName + ".avi", saveVideo.imageWidth, saveVideo.imageHeight, 20, VideoCodec.FLV1, 1000000);
 
            int frint = saveVideo.iter;
            int sbuff = MainWindow.sizeBuffer - 1;
            for (int i = 0; i < sbuff; i++)
            {
                if (frint > sbuff) return;
 
                if (saveVideo.bufferFramesBytes[frint] != null)
                {
                    using (var ms = new MemoryStream(saveVideo.bufferFramesBytes[frint]))
                    {
                        videoFileWriter.WriteVideoFrame(new Bitmap(ms));
                    }
                }
                if (frint == sbuff)
                    frint = 0;
                frint++;
            }
            videoFileWriter.Close();
        }
 
    }
}
Добавлено через 6 минут
Запускаю видео с вебкамеры, в bufferFramesByte сохраняю массив фреймов, при нажатии на Button_Click_4 в потоке собираю и сохраняю видео.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
25.05.2016, 12:55
egorchech, ИМХО, технически у вас все правильно делается - кадры сохраняете в сжатом jpeg в памяти. Можно было бы вместо покадрового сохранения делать сохранение видео. Это бы заняло меньше памяти, но я думаю в данном случае это излишнее усложнение.
Но при таком подходе, понятно что память рано или поздно закончится. Поэтому нужно кадры записывать на диск. Другого выхода нет. Если не хотите, что бы постоянно крутился диск, можно буферизировать кадры в памяти а потом, при заполнении буфера - скидывать все скопом на диск. Затем опять заполнять буфер и снова скидывать и т.д.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2016, 12:55
Помогаю со студенческими работами здесь

Видеопоток ардуино-комп
Читал здесь тему про камеру C328-7640 JPEG Camera Module W/ UART Interface. Где её купить? не могу найти. Сразу извиняюсь за такую глупую...

Прикрутить видеопоток c IP камеры на сайт
Здраствуйте, извиняюсь сразу если не в тот раздел пишу, на мой взгляд этот самый подходящий... Подскажите пожайлуста как прикрутить...

Видеопоток с IP камеры на форме Delphi
Добрый день. Подскажите пожалуйста как получить видеопоток с IP камеры на форме Delphi. Web не подходит. Спасибо.

Возможно ли получить прямую ссылку на видеопоток?
Всем привет, имею свой онлайн кинотеатр, правда фильмы беру с вконтакте, что не имеет смысла делать, ведь проще наверно найти там фильм,...

Видеопоток, как хранилище произвольных данных
Есть мысль, возможно и бредовая. А что если в видео потоке (файл или стрим) вместо обычного видео хранить произвольные данные? Как это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru