Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 29.09.2021
Сообщений: 13
.NET 3.x

rtsp + emgu, виснет!

15.11.2022, 14:11. Показов 3759. Ответов 2
Метки c#, emgu, rtsp (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Помогите пожалуйста с проблемой:

нужно получать изображение с IP камеры. Имеется IPD-C34Y00, выдающая поток rtsp. Его вижу в onvif без багов и задержек. При попытке же подключаться к нему из своей проги - начинаются зависания: проигрывает прошлые 5-10 секунд в ускоренном режиме, а дальше или зависает на последнем кадре, или же (очень редко) воспроизводит видео, но с большой задержкой.

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

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
using System;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.CvEnum;
 
namespace VideoCaptureExzmple
{
    public partial class Form1 : Form
    {
        private VideoCapture _capture = null;
        private bool _captureInProgress;
        private Mat _frame;
 
        public Form1()
        {
            InitializeComponent();
            CvInvoke.UseOpenCL = false;
            try            {
                
                _capture = new VideoCapture(@"rtsp://192.168.1.18:554/1/h264major");                
//это уже сам добавил, в процессе поиска
                _capture.Set(CapProp.Fps, 25);
                _capture.Set(CapProp.Bitrate, 4096);
                _capture.Set(CapProp.Buffersize, 3); //буфер пытаюсь поставить покороче, вычитал на забугорном форуме про похожую проблему. не помогло               
                _capture.Set(CapProp.Zoom, 1);
                _capture.ImageGrabbed += ProcessFrame;
            }
            catch (NullReferenceException excpt)
            {
                MessageBox.Show(excpt.Message);
            }
            _frame = new Mat();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (_capture != null)
            {
                if (_captureInProgress)
                {  //stop the capture
                    button1.Text = "Start Capture";
                    _capture.Pause();
                }
                else
                {
                    //start the capture
                    button1.Text = "Stop";
                    _capture.Start();
                }
 
                _captureInProgress = !_captureInProgress;
            }
        }
 
        private void ProcessFrame(object sender, EventArgs arg)
        {
            if (_capture != null && _capture.Ptr != IntPtr.Zero)
            {
                _capture.Retrieve(_frame, 0);
 
                CvInvoke.CvtColor(_frame, _grayFrame, ColorConversion.Bgr2Gray);
                                
                captureImageBox.Image = _frame;
            }
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.11.2022, 14:11
Ответы с готовыми решениями:

Emgu: Инициализатор типа "Emgu.CV.OCR.Tesseract" выдал исключение
Здравствуйте. Я делаю программу из видео: Kjdu8SjEtG0 Когда произвожу запуск, вылетает следующая ошибка: {"Ошибка при создании...

Виснет программа при компиляции, степовер не работает, так же виснет
Виснет программа при компиляции, степовер не работает, так же виснет. Программа - простейший калькулятор. ...

RTSP player
Всем привет! Кто нибудь сталкивался с задачей воспроизводить потоковое видео по протоколу RTSP? Может поделитесь кодом или ссылкой? VLC не...

2
 Аватар для Midian
605 / 387 / 198
Регистрация: 31.03.2013
Сообщений: 2,687
16.11.2022, 10:29
Попробуйте использовать версию повыше 4.3.0.3890
вот пример реализации у меня:
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
public class Camera : ObservableObject
{
    // ReSharper disable once InconsistentNaming
    private static readonly ILogger logger = LogManager.GetCurrentClassLogger();
 
    private static ReaderWriterLockSlim rwLock = new();
 
    public Camera(string cameraName, int cameraNumber, string ipAddress, string port, string login, string password, Camera9018 camera9018)
    {
        CameraName = cameraName;
        CameraNumber = cameraNumber;
        IpAddress = ipAddress;
        Port = port;
        Login = login;
        Password = password;
        Camera9018 = camera9018;
    }
 
    #region Properties
 
    public string CameraName { get; }
    public int CameraNumber { get; }
    public string IpAddress { get; }
    public string Port { get; }
    public string Login { get; }
    public string Password { get; }
    public Camera9018 Camera9018 { get; }
 
    private BitmapSource _sessionImage;
    [JsonIgnore]
    public BitmapSource SessionImage
    {
        get => _sessionImage;
        set => SetProperty(ref _sessionImage, value);
    }
 
    private BitmapSource _idvImage;
    [JsonIgnore]
    public BitmapSource IdvImage
    {
        get => _idvImage;
        set => SetProperty(ref _idvImage, value);
    }
 
    private VideoCapture _videoCapture;
 
    private bool _isSelected;
    [JsonIgnore]
    public bool IsSelected
    {
        get => _isSelected;
        set => SetProperty(ref _isSelected, value);
    }
 
    private bool _isVisible = true;
    [JsonIgnore]
    public bool IsVisible
    {
        get => _isVisible;
        set => SetProperty(ref _isVisible, value);
    }
 
    private BitmapSource _videoFrame;
    [JsonIgnore]
    public BitmapSource VideoFrame
    {
        get => _videoFrame;
        set => SetProperty(ref _videoFrame, value);
    }
 
    private bool _isLockOpen;
    public bool IsLockOpen
    {
        get => _isLockOpen;
        set => SetProperty(ref _isLockOpen, value);
    }
 
    private bool _isDoorOpen;
    public bool IsDoorOpen
    {
        get => _isDoorOpen;
        set => SetProperty(ref _isDoorOpen, value);
    }
 
    private eSessionStatus _status = eSessionStatus.Disabled;
    public eSessionStatus Status
    {
        get => _status;
        set => SetProperty(ref _status, value);
    }
 
    private byte _matchPercent;
    public byte MatchPercent
    {
        get => _matchPercent;
        set => SetProperty(ref _matchPercent, value);
    }
 
    #endregion
 
    #region Methods
 
    public void Start()
    {
        try
        {
            if (_videoCapture == null)
            {
                var cameraUrl = $"rtsp://{Login}:{Password}@{IpAddress}:{Port}";
 
                _videoCapture = new VideoCapture(cameraUrl);
                _videoCapture.ImageGrabbed += VideoCaptureImageGrabbed;
            }
 
            _videoCapture.Start();
 
            PingIpCamera();
        }
        catch (Exception ex)
        {
            logger.Error(ex);
        }
    }
 
    public void Stop()
    {
        rwLock.EnterWriteLock();
        try
        {
            if (_videoCapture != null)
            {
                _videoCapture.ImageGrabbed -= VideoCaptureImageGrabbed;
                _videoCapture.Stop();
 
                Thread.Sleep(300);
 
                _videoCapture = null;
            }
        }
        catch (Exception ex)
        {
            logger.Error(ex);
        }
        finally
        {
            rwLock.ExitWriteLock();
        }
 
        VideoFrame = null;
    }
 
    private void VideoCaptureImageGrabbed(object sender, EventArgs e)
    {
        try
        {
            var mat = new Mat();
 
            _videoCapture?.Retrieve(mat);
 
            var rawData = mat.GetRawData();
            if (!_isSelected || mat.Width == 0 || mat.Height == 0 || rawData?.Any() != true)
            {
                VideoFrame = null;
 
                return;
            }
 
            VideoFrame = ImageHelper.ByteToBitmapSource(rawData, mat.Width, mat.Height);
        }
        catch { }
    }
 
    private void PingIpCamera()
    {
        Task.Run(async () =>
        {
            var ping = new Ping();
 
            while (_isSelected)
            {
                var pingReply = ping.Send(IpAddress);
                if (pingReply?.Status != IPStatus.Success)
                {
                    Stop();
 
                    break;
                }
 
                await Task.Delay(3000);
            }
        });
    }
 
    #endregion
}
1
0 / 0 / 0
Регистрация: 29.09.2021
Сообщений: 13
16.11.2022, 17:05  [ТС]
Спасибо большое за ответ.
Ларчик просто открывался - я, как и во многочисленных (и официальных тоже) примерах, инициализировал _capture = new VideoCapture в КОНСТРУКТОРЕ!
А это с rtsp - грубая ошибка!

С USB всё работает - инициализировал, форма загрузилась, нажал кнопку "Захват изображения"... А когда у нас протокол, по которому общаются комп и камера... То, пока всё это произошло - камера "устала уже ждать ответа" от компа после инициализации и прикрыла соединение!

Перенес _capture = new VideoCapture(@"rtsp://192.168.1.18:554/1/h264major"); в событие нажатия кнопки - и всё чудесно работает ))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.11.2022, 17:05
Помогаю со студенческими работами здесь

RTSP и RTP
В чём разница RTSP протокола и RTP? Это разные вещи? или одно без другого не может быть? Если да то чтобы подключится я...

RTSP и DirectShow
Доброго времени суток. Может у кого был опыт, как реализовать видео превью с IP камеры при помощи DirectShow ?

RTSP (RTP)
Народ, подскажите имеется файл сетевого потока с данными RTSP протокола, файл без расширения, не pcap, каким образом можно извлечь из него...

Работа с rtsp
День добрый, форум. По работе нужно разобраться с воспроизведением видео по протоколу rtsp. Можете подсказать, с чего лучше начать? Либо...

Воспроизведение rtsp
Доброго времени суток! У меня возникла проблема с воспроизведением rtsp на форме. Пытался использовать ActiveX VLCPlugin, но ни как не...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru