1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 40
1

Воспроизведение видео с ip камеры

22.04.2016, 15:21. Показов 54134. Ответов 78
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Решил написать программку, которая отображала бы в окне поток из сети (по протоколу http или rtsp). Главное, чтобы без задержки!
Имеется обычная китайская ip камера 2mp. Программа Onvif отображает поток с этой камеры по rtsp без задержек. И я хочу также. Как это можно реализовать? И можно там, чтобы сделать цифровой zoom с интерполяцией!?

Неделю перекапывал весь интернет и только закопался:
1 - Поставил плагин VLC в borland, но выдает с секундной задержкой. Вариант отпал(
2 - Попробовал вариант с DirectShow.. значит надо установить фильтр для ip камеры:
- RTSP Client DirectShow Source Filter - не получилось добавить в область GraphEdit (М.б. из-за того что у меня Win7 x64)
- IP Camera [JPEG/MJPEG] DirectShow Filter - виснет GraphEdit при добавлении в область (М.б. из-за того что у меня Win7 x64)
- Onvif Filter (HappyTimeSoft) - Программой не удалось открыть поток с ip камеры(выдает ошибку что устройство не может открыть)
3 - Подумал о варианте использовать GStreamer, но не нашел простяцкого описания о реализации этого метода. (Ну этот вариант на крайняк, т.к. хочу, чтобы моя программа была самостоятельной без каких-либо дополнительных программ)

И по всем этим причинам хочу узнать: Может где-то я что-то не дотянул? Как мне воспроизвести видео с ip камеры без задержки, в среде Borland, например!? И можно чтобы потом добавить цифровой zoom с интерполяцией!?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2016, 15:21
Ответы с готовыми решениями:

Запись видео с веб камеры
Новичок в этом деле. Я даже не знаю в какую тему мой вопрос опубликовать. Сейчас набираю теорию...

Захват видео с веб-камеры (C++)
Здравствуйте! Я установил Visual Studio 2015 Community и библиотеку OpenCV 3.1.0 на Windows 10....

DirectShow: захват видео с веб-камеры, воспроизведение
Посоветуйте для начала понятный мануал, что-бы можно было с нуля разобраться (желательно без воды)....

Наложить видео с альфа каналом поверх картинки с камеры, чтобы видео не перекрывало картинку
всем привет! стоит такая задача: есть видео в контейнере .mov, которое содержит альфаканал...

78
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
16.06.2016, 19:28 21
Студворк — интернет-сервис помощи студентам
tiundv
1 OMG
2 вы запихали приложение в код который раньше был DLL - в этом случае вам не нужны DECL_SPEC, но где же в этом случае сами функции то и весь их обвес, что то их не видно... наверное остались где-то в другом модуле
3 HOLLY SHIT
4 у вас в заголовочном файле строчки после #endif //ffmpeg_test_h - это нехорошо
5 где же присваивается значение hWnd? нигде не видно... в то же время GetWindowRect и paint спокойно в него тычут...
1
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
18.06.2016, 22:04 22
vxg - Спасибо за помощь. Все работает. Теперь пытаюсь вывести видео в несколько дочерних окошек. Пока не получается. Понимаю почему но пока решение не нашел. Пытаюсь создать отдельный класс с методами и переменными чтоб для каждого дочернего окошка работал свой экземпляр класса с переменными. Но не знаю правильно ли это будет в плане оптимизации и быстродействия. Я просто запутался немного. Допустим переменные (HWND hWnd; int buffer_w, buffer_h; char *form_bmp_bits; HBITMAP form_bmp_h как я понимаю должны для каждого окошка и потока камеры быть отдельно. Но они глобальные и изменение влияют на все выводы дочерних окон. Я пытаюсь засунуть все эти переменные и методы их использующие в один класс и для каждого созданного дочернего окна буду создавать новый этот класс и передавать в него нужные параметры и вызывать функции. Но столкнулся с тем что не могу запихнуть все нужные методы в класс. Например метод (static DWORD WINAPI proc) вообще не получается засунуть в класс.
Может я не в ту сторону смотрю и не так понимаю? Прошу разьяснить что я не так делаю или не так понимаю
Заранее БОЛЬШОЕ СПАСИБО !!!
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
18.06.2016, 22:26 23
tiundv, все отлично засовывается в один класс - в проекте откуда это взято оно так и есть - я сделал все глобальным для упрощения примера и что бы жизнь мёдом не казалась) процедура потока не нуждается в размножении - просто создавая для каждой камеры свой поток передавайте ему в качестве параметра указатель на тот самый класс и процедура будет работать на его данных
1
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
18.06.2016, 23:22 24
Спасибо за помощь vxg. Буду копать в этом направлении.

Добавлено через 13 минут
vxg : Еще вопрос - при внедрении метода (static DWORD WINAPI proc(LPVOID arg)) в класс "InitCam" типа так static DWORD WINAPI InitCam:roc(LPVOID arg) ругается на static что типа здесь нельзя указывать тип хранения а если убрать static то при компиляции выдвет ошибку :
Кликните здесь для просмотра всего текста
нестатическая ссылка не член должна указываться относительно заданного объекта Win32Project2


Добавлено через 3 минуты
какой то смайлик сам появляется вместо буквы "p" в proc. правка не помогает. что за прикол не знаю
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
19.06.2016, 00:38 25
tiundv, не делайте эту функцию внутри класса она должна быть сама по себе - посмотрите статью на хабре на которую я давал ссылку
1
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
19.06.2016, 04:35 26
vxg - Я тогда вообще не понимаю какие методы и переменные нужно поместить в класс. Они все ссылаются друг на друга. Пример по вашей ссылке смотрел...там мне вообще не понятно что и где находится...буду изучать и пробовать..терпение и труд все перетрут...спасибо вам за все
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
19.06.2016, 07:55 27
tiundv, у страха глаза велики) чуть позже скину как можно это завернуть в класс
1
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
19.06.2016, 11:13 28
vxg - Буду признателен

Добавлено через 43 секунды
С праздником вас всех !!!
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
19.06.2016, 15:12 29
tiundv, к примеру так
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
#include <windows.h>
//---------------------------------------------------------------------------
extern "C" {
#include <libavformat/avformat.h>
#include <libavdevice/avdevice.h>
#include <libswscale/swscale.h>
}
 
#include <stdio.h>
 
class ipc_t
{
public:
    AVFormatContext *format_ctx;
 
    int stream;
 
    AVCodecContext *codec_ctx;
 
    AVFrame *frame;
 
    AVFrame *x_bgr_frame;
 
    SwsContext *x_bgr_ctx;
 
    HANDLE thread_h;
    int terminated;
 
    DWORD proc(void);
 
    void ffmpeg_test_start(char *src);
    void ffmpeg_test_stop(void);
    int ffmpeg_test_get_bmp(void *bmp_bits, int w, int h);
 
 
/********************/
 
 
    HWND hWnd;
     
    int buffer_w, buffer_h;
     
    char *form_bmp_bits;
    HBITMAP form_bmp_h;
     
    void cb(void);
    void create_frame_buffer(void);
    void destroy_frame_buffer(void);
    void init(void);
    void paint(void);
    void uninit(void);
};
 
static DWORD WINAPI global_proc(LPVOID arg)
{
    ipc_t *ipc= (ipc_t *)arg;
    return ipc->proc();
}
 
DWORD ipc_t::proc(void)
{
    AVPacket packet;
    int finished;
    while (!terminated)
    {
        if (av_read_frame(format_ctx, &packet) != 0)
        {
            return 0;
        }
        else if (packet.stream_index == stream)
        {
            if (avcodec_decode_video2(codec_ctx, frame, &finished, &packet) > 0)
            {
                if (finished)
                {
                    cb();
                }
            }
        }
        av_free_packet(&packet);
    }
 
    return 0;
}
 
void ipc_t::ffmpeg_test_start(char *src)
{
    av_register_all();
 
    format_ctx = avformat_alloc_context();
    if (!format_ctx)
    {
        return;
    }
 
    AVDictionary *opts = 0;
    //av_dict_set(&opts, "rtsp_transport", "tcp", 0);
 
    if (avformat_open_input(&format_ctx, src, 0, &opts) != 0)
    {
        return;
    }
 
    if (avformat_find_stream_info(format_ctx, 0) < 0)
    {
        return;
    }
  
    stream = -1;
    for (int i = 0; i < format_ctx->nb_streams; i++)
        if (format_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
        {
            stream = i;
            break;
        }
    if (stream == -1)
    {
        return;
    }
  
    codec_ctx = format_ctx->streams[stream]->codec;
  
    AVCodec *codec = avcodec_find_decoder(codec_ctx->codec_id);
    if (!codec)
    {
        return;
    }
 
    if (avcodec_open2(codec_ctx, codec, 0) != 0)
    {
        return;
    }
 
    frame = av_frame_alloc();
    if (!frame)
    {
        return;
    }
 
    x_bgr_frame = 0;
 
    terminated = 0;
    DWORD thread_id;
    thread_h = CreateThread
    (
        0,
        0,
        global_proc,
        this,
        0,
        &thread_id
    );
}
 
void ipc_t::ffmpeg_test_stop(void)
{
    terminated = 1;
 
    WaitForSingleObject(thread_h, INFINITE);
    CloseHandle(thread_h);
 
    sws_freeContext(x_bgr_ctx);
 
    av_free(x_bgr_frame);
    av_free(frame);
  
    avcodec_close(codec_ctx);
  
    avformat_close_input(&format_ctx);
 
    avformat_free_context(format_ctx);
}
 
int ipc_t::ffmpeg_test_get_bmp(void *bmp_bits, int w, int h)
{
    if (!x_bgr_frame || x_bgr_frame->width != w || x_bgr_frame->height != h)
    {
        sws_freeContext(x_bgr_ctx);
        av_free(x_bgr_frame);
 
        x_bgr_frame = 0;
        x_bgr_ctx = 0;
 
        x_bgr_frame = av_frame_alloc();
        if (!x_bgr_frame)
        {
            return 0;
        }
 
        x_bgr_frame->width = w;
        x_bgr_frame->height = h;
 
        if 
        (
            avpicture_fill((AVPicture *)x_bgr_frame, 0, PIX_FMT_RGB32, w, h) < 0
        )
        {
            return 0;
        }
 
        x_bgr_ctx = sws_getContext(codec_ctx->width, codec_ctx->height, codec_ctx->pix_fmt, w, h, PIX_FMT_RGB32, SWS_BICUBIC, 0, 0, 0);
        if (!x_bgr_ctx)
        {
            return 0;
        }
    }
 
    x_bgr_frame->data[0] = (uint8_t *)bmp_bits;
    x_bgr_frame->data[0] += x_bgr_frame->linesize[0] * (h - 1);
    x_bgr_frame->linesize[0] = -x_bgr_frame->linesize[0];   
    sws_scale(x_bgr_ctx, frame->data, frame->linesize, 0, codec_ctx->height, x_bgr_frame->data, x_bgr_frame->linesize);
    x_bgr_frame->linesize[0] = -x_bgr_frame->linesize[0]; 
 
    return 1;
}
//---------------------------------------------------------------------------
void ipc_t::cb(void)
{
    ffmpeg_test_get_bmp(form_bmp_bits, buffer_w, buffer_h);
    InvalidateRect(hWnd, NULL, FALSE);    
}
//---------------------------------------------------------------------------
void ipc_t::create_frame_buffer(void)
{
    BITMAPINFOHEADER form_bmi_hdr;
    form_bmi_hdr.biSize = sizeof(BITMAPINFOHEADER);
    form_bmi_hdr.biWidth = buffer_w;
    form_bmi_hdr.biHeight = buffer_h;
    form_bmi_hdr.biPlanes = 1;
    form_bmi_hdr.biBitCount = 32;
    form_bmi_hdr.biCompression = BI_RGB;
    form_bmi_hdr.biSizeImage = form_bmi_hdr.biWidth * form_bmi_hdr.biHeight * 4;
    form_bmi_hdr.biXPelsPerMeter = 0;
    form_bmi_hdr.biYPelsPerMeter = 0;
    form_bmi_hdr.biClrUsed = 0;
    form_bmi_hdr.biClrImportant = 0;
 
    form_bmp_h = CreateDIBSection(0, (BITMAPINFO *)&form_bmi_hdr, DIB_RGB_COLORS, (void **)&form_bmp_bits, 0, 0);
}
//---------------------------------------------------------------------------
void ipc_t::destroy_frame_buffer(void)
{
    DeleteObject(form_bmp_h);
}
//---------------------------------------------------------------------------
void ipc_t::init(void)
{
    create_frame_buffer();
 
    ffmpeg_test_start("rtsp://127.0.0.1:8554/");
}
//---------------------------------------------------------------------------
void ipc_t::paint(void)
{
    if (form_bmp_h)
    {
        PAINTSTRUCT ps;
        HDC paint_hdc = BeginPaint(hWnd, &ps);
 
        HDC hdc_1 = CreateCompatibleDC(paint_hdc);
        HDC hdc_2 = CreateCompatibleDC(paint_hdc);
 
        HBITMAP h_1 = CreateCompatibleBitmap(paint_hdc, buffer_w, buffer_h);
        HBITMAP old_h_1 = (HBITMAP)SelectObject(hdc_1, h_1);
 
        HBITMAP old_h_2 = (HBITMAP)SelectObject(hdc_2, form_bmp_h);
        BitBlt(hdc_1, 0, 0, buffer_w, buffer_h, hdc_2, 0, 0, SRCCOPY);
 
        BitBlt(paint_hdc, 0, 0, buffer_w, buffer_h, hdc_1, 0, 0, SRCCOPY);
 
        SelectObject(hdc_1, old_h_1);
        SelectObject(hdc_2, old_h_2);
 
        DeleteObject(h_1);
 
        DeleteDC(hdc_1);
        DeleteDC(hdc_2);
 
        EndPaint(hWnd, &ps);
    }
}
//---------------------------------------------------------------------------
void ipc_t::uninit(void)
{
    ffmpeg_test_stop();
 
    destroy_frame_buffer();
}
//---------------------------------------------------------------------------
ipc_t ipc;
 
LRESULT CALLBACK PictViewWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam) {
    switch (Message) {
    case WM_PAINT:
        ipc.paint();
        return 0;
    case WM_DESTROY:
        ipc.uninit();
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) {
    WNDCLASS WndClass;
    MSG Msg;
    char szClassName[] = "PictView";
 
    WndClass.style = CS_HREDRAW | CS_VREDRAW;
    WndClass.lpfnWndProc = PictViewWndProc;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hInstance = hInstance;
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    WndClass.lpszMenuName = NULL;
    WndClass.lpszClassName = TEXT("PictView");
 
    if (!RegisterClass(&WndClass)) {
        MessageBox(NULL, TEXT("Can't register class"), TEXT("Error"), MB_OK);
        return 0;
    }
 
    ipc.hWnd = CreateWindow(TEXT("PictView"), TEXT("Picture View"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    if (!ipc.hWnd) {
        MessageBox(NULL, TEXT("Can't create window"), TEXT("Error"), MB_OK);
        return 0;
    }
 
    ShowWindow(ipc.hWnd, nCmdShow);
    UpdateWindow(ipc.hWnd);
 
    RECT rect;
    GetWindowRect(ipc.hWnd, &rect);
    ipc.buffer_w = rect.right - rect.left;
    ipc.buffer_h = rect.bottom - rect.top;
 
    ipc.init();
    while (GetMessage(&Msg, NULL, 0, 0)) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
1
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
19.06.2016, 16:22 30
vxg - Спасибо большое. вы очень мне помогли.
0
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
30.07.2016, 10:21 31
У меня опять проблема... После обновления visual studio не собирается проект... ругается на 195 строку выше представленного кода..."avpicture_fill deprecated"... Облазил весь инет но так и не нашел рабочую замену ему... где указывают на использование "av_image_fill_arrays" или "avpicture_layout"... но их вообще нет в сборке ffmpeg 3.0.1 которую я использую... Самое интересное то что в проектах до обновления при компиляции эта ошибка не вылезает а вот в новом созданном проекте она выскакивает... Глушить ошибки не хочу чтоб это потом боком не вылезло..
Буду очень признателен за любую помощь...
Спасибо!!!
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
30.07.2016, 10:35 32
tiundv, у вас обновился ffmpeg, попробуйте просто убрать этот вызов, должно работать и без него
1
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
30.07.2016, 14:45 33
Не работает... После удаления показывает черный экран и все

Добавлено через 1 час 21 минуту
да и ffmpeg у меня не обновлялся... цепляю его из папки в которую положил его сам из архива... я не пользуюсь свн и т.п... и другие проекты созданные до обновления работают без этой ошибки... че то как то странно...

Добавлено через 2 минуты
нашел вот пример как конвертировать в rgb.... но не знаю как его прикрутить потому что не понимаю что где что делает...
вот пример
Кликните здесь для просмотра всего текста
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
int VideoFileInstance::convertToRGBFrame(AVFrame **yuvframe,AVFrame **rgbPictInfo) {
    int ret;
    int width = ifmt_ctx->streams[VIDEO_STREAM_INDEX]->codec->width;
    int height = ifmt_ctx->streams[VIDEO_STREAM_INDEX]->codec->height;
 
 
 
 
    //init context if not done already.
    if (imgConvertCtxYUVToRGB == NULL) {
        //init once
        imgConvertCtxYUVToRGB = sws_getContext(width, height, PIX_FMT_YUV420P, width, height, PIX_FMT_RGB24, SWS_FAST_BILINEAR, 0, 0, 0);
 
        if(imgConvertCtxYUVToRGB == NULL) {
            av_log(NULL,AV_LOG_ERROR,"error creating img context");
            return -1;
        }
 
    }
 
 
    // call av_freep(rgbPictInfo->data) to free memory
 
    av_image_alloc( (*rgbPictInfo)->data,   //data to be filled
                   (*rgbPictInfo)->linesize,//line sizes to be filled
                   width, height,
                   PIX_FMT_RGB24,           //pixel format
                   32                       //aling
                   );
 
 
 
    ret = sws_scale(imgConvertCtxYUVToRGB, (*yuvframe)->data, (*yuvframe)->linesize, 0, height,
              (*rgbPictInfo)->data, (*rgbPictInfo)->linesize);
 
 
    return ret;
}


Добавлено через 8 минут
в интернете уроков нет по ffmpeg на с-с++... может кто обьяснить что в ffmpeg как работает.... я имею ввиду последовательность. что вначале делается и так по порядку... например для чего нужен контекст и когда его надо вызывать....
буду благодарен

Добавлено через 14 минут
для начала расскажите про avpicture_fill... для чего он нужен...
0
1 / 1 / 0
Регистрация: 24.08.2016
Сообщений: 13
12.02.2017, 22:32 34
Доброго времени. Уважаемый VXG прошу помощи. Я в программировании любитель, тем более Дельфист. Но мне очень нужно вот как раз такую маленькую программку как у вас. Но с одним изменением. Записывать видео поток по нажатию кнопки на клавиатуре. Единственное на что хватает моих скудных знаний это запустить ffmpeg.exe с параметрами записи.
Вроде будет работать но неудобно то что это происходит в другой под программе и + удваивается нагрузка на сеть.

Может подскажете код для внедрения в ваш проект.

Спасибо за уделённое время.
И огромное спасибо за выложенный код этой программки, она мне очень помогла.
0
64 / 64 / 16
Регистрация: 07.05.2016
Сообщений: 304
12.02.2017, 22:38 35
leshiy532, напишите для чего вы разрабатываете
0
1 / 1 / 0
Регистрация: 24.08.2016
Сообщений: 13
13.02.2017, 07:01 36
По вай-фаю нужно мониторить один объект и по решению оператора делать запись. одно окно на весь экран и одна кнопка на клаве (начать запись, остановить запись). Пока задача стоит в этом.
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
13.02.2017, 10:21 37
leshiy532, нажатие клавиши ловится как всегда - например через ShortCut пункта контекстного меню формы (работает только если пользователь на форме) или если нужен глобальный перехват то через WinAPI (код для C++)
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
//h-файл
 
        BEGIN_MESSAGE_MAP
            VCL_MESSAGE_HANDLER(WM_HOTKEY, TMessage, hot_key_message)
        END_MESSAGE_MAP(TForm)
 
        void __fastcall hot_key_message(TMessage &Message);
 
//в конструкторе
 
    RegisterHotKey(Handle, 0, 0, VK_F11);
 
//в FormCloseQuery
 
    UnregisterHotKey(Handle, 0);
 
//обработчик
 
void __fastcall Tstart_form::hot_key_message(TMessage &Message)
{
    if ((UINT)LOWORD(Message.LParam) == 0)
    {
        if ((UINT)HIWORD(Message.LParam) == VK_F11)
        {
            //делаем что-то
        }
    }
 
    TForm::Dispatch(&Message);
}
если у вас камера Hikvision то возможно вам подойдет ipc preview - ну или что-то в коде позаимствуете.
1
1 / 1 / 0
Регистрация: 24.08.2016
Сообщений: 13
13.02.2017, 12:58 38
Спасибо.

А подскажите как очищать надписи которые рисуются в окне. Т.е. как удалить надпись а потом вывести что то другое...

Я так понимаю что draw_text за это отвечает. Но у меня только смешивает надписи.
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
13.02.2017, 13:19 39
leshiy532, каждый раз когда рисуется кадр сверху на нем рисуется текст - какой текст задан в draw_text тот и нарисуется
0
1 / 1 / 0
Регистрация: 24.08.2016
Сообщений: 13
16.02.2017, 20:03 40
Спасибо, я понял свою ошибку. Я думал что обработка текста, где задается сам текст, обрабатывается только единожды и не как не менял переменную. Не понимаю почему сразу не подумал про это.

Вывод текста сделал на определённое количество кадров.

C++
1
2
3
4
5
6
7
8
9
10
if(i_can_video_start<50)
    {
      i_can_video_start++;
    s = "Запись видео";
    c->Brush->Style = bsClear;
    c->Font->Color = clWhite;
    c->Font->Size = 24;
    c->Font->Style = TFontStyles()<< fsBold;
    c->TextOutA(w / 2 - c->TextWidth(s) / 2, h / 2 - c->TextHeight(s) / 2, s);
    }
А нажатие кнопки решил сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int i_zap=0;
void __fastcall Tmain_form::FormKeyPress(TObject *Sender, char &Key)
{
     switch ( Key ) {
       case 'q':
       case 'Q':
       case 'é':
       case 'É': {
 
       if (i_zap<1)
                  {
       i_zap=1;
       i_can_video_start=0;
       ShellExecute(Handle, "open", "ffmpeg.exe", "-y -i rtsp://192.168.0.199:554/user=admin_password=tlJwpbo6_channel=1_stream=0.sdp?real_stream -c copy ./video/video_555.h264", NULL, SW_HIDE);
                   }
       else
            {
       i_can_video_end=0;
       AnsiString command =  AnsiString("taskkill.exe /f /im ffmpeg.exe");
       WinExec(command.c_str(),SW_HIDE);
            }
                          }break;
}
Не знаю на сколько правильно, но вроде всё работает.

Правильно ведь говорят, всё сложное состоит из простого.
1
16.02.2017, 20:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2017, 20:03
Помогаю со студенческими работами здесь

Обработка видео с камеры видео наблюдения (для экспертов)
Обработка видео с камеры видео наблюдения (для экспертов) Имеются несколько каналов видео с камер...

дырка для захвата видео с видео камеры
На моем компе стоит Geforce 7600 GS на ней нет порта для видеокамеры как на ноуте:wall: можно ли...

Как сделать так что бы обычное видео из жесткого диска подавалось как видео с вэб-камеры?
кто знает?

Воспроизведение видео
Как в Windows.Forms загрузить видео? Когда я жмякаю на кнопку - &gt; появляется видео и без сигнала...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru