Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++: COM, OLE, ActiveX

Войти
Регистрация
Восстановить пароль
 
 
fademike
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 26
#1

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

22.04.2016, 15:21. Просмотров 4453. Ответов 55
Метки нет (Все метки)

Добрый день!
Решил написать программку, которая отображала бы в окне поток из сети (по протоколу 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2016, 15:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Воспроизведение видео с ip камеры (C++ COM):

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

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

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

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

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

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

55
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
22.04.2016, 17:26 #2
FFMPEG после обработки напильником легко справляется с получением картинок из RTSP. Доставка на экран без проблем идёт через WM_PAINT. Сейчас не за ПК как будет время кину эскиз

Добавлено через 2 минуты
Но есть особенность. Тут часть что общается с FFMPEG лично мне в 6-м билдере собрать не удалось - выносил в DLL которую собирал в студии
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
23.04.2016, 00:37 #3
Как и обещал выкладываю пример дружбы FFMPEG с Borland C++ Builder через DLL созданную в Visual C++
демонстрируется подключение к IP-камере (RTSP)
для тех кто не хочет качать привожу текст
заголовочный файл DLL
Кликните здесь для просмотра всего текста
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
//------------------------------------------------------------------------------
//ffmpeg_test 1.0
//------------------------------------------------------------------------------
#ifndef ffmpeg_test_h
#define ffmpeg_test_h
//------------------------------------------------------------------------------
#include <windows.h>
//------------------------------------------------------------------------------
#ifdef EXPORT
#define DECL_SPEC __declspec(dllexport) __stdcall
#else
#define DECL_SPEC __declspec(dllimport) __stdcall
#endif
 
#ifdef __cplusplus
extern "C" {
#endif
//------------------------------------------------------------------------------
void DECL_SPEC ffmpeg_test_start(char *src, void (*cb_fn)(void));
void DECL_SPEC ffmpeg_test_stop(void);
int DECL_SPEC ffmpeg_test_get_bmp(void *bmp_bits, int w, int h); //32 bit
//------------------------------------------------------------------------------
#ifdef __cplusplus
} //extern "C"
#endif
 
#undef EXPORT
//------------------------------------------------------------------------------
#endif //ffmpeg_test_h

тело DLL
Кликните здесь для просмотра всего текста
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
#define EXPORT
#include "ffmpeg_test.h"
 
extern "C" {
#include <libavformat/avformat.h>
#include <libavdevice/avdevice.h>
#include <libswscale/swscale.h>
}
 
#include <stdio.h>
 
static AVFormatContext *format_ctx;
 
static int stream;
 
static AVCodecContext *codec_ctx;
 
static AVFrame *frame;
 
static AVFrame *x_bgr_frame;
 
static SwsContext *x_bgr_ctx;
 
static HANDLE thread_h;
static int terminated;
 
void (*cb_fn)(void);
 
static DWORD WINAPI proc(LPVOID arg)
{
    AVPacket packet;
    int finished;
    while (!terminated)
    {
        if (av_read_frame(format_ctx, &packet) != 0)
        {
            ExitThread(0);
        }
        else if (packet.stream_index == stream)
        {
            if (avcodec_decode_video2(codec_ctx, frame, &finished, &packet) > 0)
            {
                if (finished)
                {
                    cb_fn();
                }
            }
        }
        av_free_packet(&packet);
    }
 
    ExitThread(0);
}
 
void DECL_SPEC ffmpeg_test_start(char *src, void (*cb_fn)(void))
{
    ::cb_fn = cb_fn;
 
    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,
        proc,
        0,
        0,
        &thread_id
    );
}
 
void DECL_SPEC 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 DECL_SPEC 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)
    {
        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;
}
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

заголовочный файл формы
Кликните здесь для просмотра всего текста
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
//---------------------------------------------------------------------------
 
#ifndef main_form_unitH
#define main_form_unitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class Tmain_form;
//---------------------------------------------------------------------------
class repaint_thread_t : public TThread
{
public:
    Tmain_form *form;
 
    repaint_thread_t(bool CreateSuspended, Tmain_form *form);
 
    void __fastcall repaint(void);
 
    virtual void __fastcall Execute(void);
};
//---------------------------------------------------------------------------
class Tmain_form : public TForm
{
__published:    // IDE-managed Components
        void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
        void __fastcall FormResize(TObject *Sender);
private:    // User declarations
public:     // User declarations
        __fastcall Tmain_form(TComponent* Owner);
 
        void __fastcall WMPaint(TWMPaint& Message);
        void __fastcall WMEraseBkgnd(TWMEraseBkgnd& Message);
 
        BEGIN_MESSAGE_MAP
            VCL_MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint)
            VCL_MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd)
        END_MESSAGE_MAP(TForm)
 
        HANDLE h_a;
        HANDLE h_b;
 
        int buffer_w, buffer_h;
 
        char *form_bmp_bits;
        HBITMAP form_bmp_h;
 
        TCanvas *mem_c;
 
        repaint_thread_t *repaint_thread;
 
        void create_frame_buffer(void);
        void destroy_frame_buffer(void);
 
        void draw_text(TCanvas *c, int w, int h);
};
//---------------------------------------------------------------------------
extern PACKAGE Tmain_form *main_form;
//---------------------------------------------------------------------------
#endif

тело формы
Кликните здесь для просмотра всего текста
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "main_form_unit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tmain_form *main_form;
//---------------------------------------------------------------------------
#include "ffmpeg_test.h"
//---------------------------------------------------------------------------
class mt_obj
{
public:
    mt_obj(void) {InitializeCriticalSection(&cs);}
    virtual ~mt_obj(void) {DeleteCriticalSection(&cs);}
 
    void lock(void) {EnterCriticalSection(&cs);}
    void unlock(void) {LeaveCriticalSection(&cs);}
 
private:
    CRITICAL_SECTION cs;
 
private:
    mt_obj(const mt_obj &) {}
    const mt_obj &operator =(const mt_obj &) {}
};
 
static mt_obj cs;
//---------------------------------------------------------------------------
repaint_thread_t::repaint_thread_t(bool CreateSuspended, Tmain_form *form): TThread(CreateSuspended), form(form) {}
 
void __fastcall repaint_thread_t::repaint(void)
{
    form->Repaint();
}
 
void __fastcall repaint_thread_t::Execute(void)
{
    while (!Terminated)
    {
        WaitForSingleObject(form->h_a, 250);
        Synchronize(repaint);
        WaitForSingleObject(form->h_b, 250);
    }
}
//---------------------------------------------------------------------------
void cb_fn(void)
{
    cs.lock();
    ffmpeg_test_get_bmp(main_form->form_bmp_bits, main_form->buffer_w, main_form->buffer_h);
    cs.unlock();
 
    ResetEvent(main_form->h_b);
    SetEvent(main_form->h_a);
    ResetEvent(main_form->h_a);
    SetEvent(main_form->h_b);
}
//---------------------------------------------------------------------------
void Tmain_form::create_frame_buffer(void)
{
    buffer_w = ClientWidth;
    buffer_h = ClientHeight;
 
    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 Tmain_form::destroy_frame_buffer(void)
{
    DeleteObject(form_bmp_h);
}
//---------------------------------------------------------------------------
__fastcall Tmain_form::Tmain_form(TComponent* Owner)
        : TForm(Owner)
{
    ClientWidth = 400;
    ClientHeight = 300;
 
    h_a = CreateEvent(0, FALSE, FALSE, 0);
    h_b = CreateEvent(0, FALSE, FALSE, 0);
 
    DoubleBuffered = true;
 
    mem_c = new TCanvas;
 
    create_frame_buffer();
 
    repaint_thread = new repaint_thread_t(false, this);
 
    ffmpeg_test_start("rtsp://admin:12345@192.168.1.2/h264/ch1/sub/av_stream", cb_fn);
}
//---------------------------------------------------------------------------
void Tmain_form::draw_text(TCanvas *c, int w, int h)
{
    AnsiString s = "...HELLO WORLD...";
 
    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);
}
//---------------------------------------------------------------------------
void __fastcall Tmain_form::WMPaint(TWMPaint& Message)
{
    if (form_bmp_h)
    {
        PAINTSTRUCT ps;
        HDC paint_hdc = BeginPaint(Handle, &ps);
 
        HDC hdc_1 = CreateCompatibleDC(paint_hdc);
        HDC hdc_2 = CreateCompatibleDC(paint_hdc);
        mem_c->Handle = hdc_1;
 
        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);
 
        // ...do something with hdc_1...
        draw_text(mem_c, buffer_w, buffer_h);
 
        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(Handle, &ps);
    }
}
//---------------------------------------------------------------------------
void __fastcall Tmain_form::WMEraseBkgnd(TWMEraseBkgnd& Message)
{
    Message.Result = 1;
}
//---------------------------------------------------------------------------
void __fastcall Tmain_form::FormCloseQuery(TObject *Sender, bool &CanClose)
{
    CloseHandle(h_a);
    CloseHandle(h_b);
 
    ffmpeg_test_stop();
 
    delete repaint_thread;
 
    destroy_frame_buffer();
}
//---------------------------------------------------------------------------
void __fastcall Tmain_form::FormResize(TObject *Sender)
{
    cs.lock();
    destroy_frame_buffer();
    create_frame_buffer();
    cs.unlock();
}
//---------------------------------------------------------------------------

для работы нужен ffmpeg-...-win32-shared и ffmpeg-...-win32-dev качаем здесь
моменты настройки проектов описаны в файле ffmpeg_test_bcb/HELP/HELP.txt
3
Миниатюры
Воспроизведение видео с ip камеры  
Вложения
Тип файла: rar ffmpeg_test_bcb.rar (278.5 Кб, 50 просмотров)
Тип файла: rar ffmpeg_test.rar (224.9 Кб, 59 просмотров)
fademike
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 26
23.04.2016, 16:20  [ТС] #4
Ого! Спасибо! На неделе воспользуюсь материалом!
А что скажете на счет OpenCV!? Проще ли он!?
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
23.04.2016, 16:35 #5
Цитата Сообщение от fademike Посмотреть сообщение
А что скажете на счет OpenCV!? Проще ли он!?
у меня сложилось впечатление что это очень сложная штука, но мне просто не нужно было делать те вещи которые он по описаниям умеет и я не стал связываться. привлекать его для масштабирования изображения излишне. приведенный код уже растягивает изображение до тех размеров которые вы ему укажите (сейчас это размеры окна)
0
starkiron
63 / 63 / 10
Регистрация: 07.05.2016
Сообщений: 304
15.05.2016, 00:38 #6
Мне интересно почему средствами opencv именно подавая поток в камеру не все камеры работают надлежайшим образом с rtsp? и еще зависит о камеры конкретной
0
tibul
0 / 0 / 0
Регистрация: 14.05.2016
Сообщений: 7
15.05.2016, 00:51 #7
Привет ребята. У меня тоже есть чем поделится с вами - надеюсь будет полезно, единственное, придется попотеть, т.к. там без перевода, но Человек открыл многие просторы, ( не буду начинать с Чего, но Одно скажу, с помощью его можно в ВК делать что хошь,,, только я не скажу где у него это написано, просто в реальную тему отвечу, что вы разрабатываете, у него имеется, но все ни так просто, кароче вот вам адрес, читайте: Naughter
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
15.05.2016, 07:03 #8
tibul, какого дьявола вы тут ребусы загадываете? Причём тут ВК? Вбивание указанного вами слова в Гугл даёт по теме ТС ноль.
0
fademike
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 26
19.05.2016, 12:31  [ТС] #9
vxg, спамит tibul, походу...
А Ваши исходники с ffmpeg я запустил и был в восторге от быстродействия! Он заработал как с rtsp так и с http!!
Скоро у меня появится камера с MJPEG и буду пытаться как-нибудь воспроизвести видео и с нее..
Еще раз спасибо огромное за исходнички!
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
19.05.2016, 13:16 #10
Цитата Сообщение от fademike Посмотреть сообщение
Еще раз спасибо
на хабре есть статья о том из чего все это родилось Передача видео с глубоководного робота с ценными замечаниями как это все можно еще сильнее убыстрить. к сожалению большая часть замечаний упирается в "а вы пересоберите FFMPEG, купите железо с аппаратной поддержкой кодирования, перепишите код и вообще перейдите на DirectX" но некоторые моменты заставляют воображение работать
0
tiundv
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 22
12.06.2016, 16:48 #11
Привет. Вопрос к "vxg". Я начал только изучать с++ и многое мне еще не понятно. Как я понимаю ваш пример под Borland C++. Я же изучаю пользуюсь vs2015. Так вот сам вопрос... Как можно ваш пример переделать под winApi в visual studio? Целый день бьюсь и не получается. Гугл не помог тоже. Если у вас будет время и желание то пожалуйста приведите пример. С FFmpegom я разобрался(могу и декодировать и кодировать и сохранять в файл и читать из файла) а вот вывести на экран из потока камеры или видео не получается. Вот пример моего окна который читает файл .bmp и выводит на экран. Если можно то покажите на нем
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
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) {
    HWND hWnd;
    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;
    }
 
    hWnd = CreateWindow(TEXT("PictView"), TEXT("Picture View"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    if (!hWnd) {
        MessageBox(NULL, TEXT("Can't create window"), TEXT("Error"), MB_OK);
        return 0;
    }
 
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 
    while (GetMessage(&Msg, NULL, 0, 0)) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
 
LRESULT CALLBACK PictViewWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam) {
    HDC hDC, hCompatibleDC;
    PAINTSTRUCT PaintStruct;
    HANDLE hBitmap, hOldBitmap;
    RECT Rect;
    BITMAP Bitmap;
    ///
    //  MessageBox(NULL, TEXT("pFrameRGB = NULL!"), TEXT("Error"), MB_OK);
    ///
    hBitmap = LoadImage(NULL, TEXT("picture.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    GetObject(hBitmap, sizeof(BITMAP), &Bitmap);
    hDC = GetDC(hWnd);
    hCompatibleDC = CreateCompatibleDC(hDC);
    hOldBitmap = SelectObject(hCompatibleDC, hBitmap);
    GetClientRect(hWnd, &Rect);
    StretchBlt(hDC, 0, 0, Rect.right, Rect.bottom, hCompatibleDC, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, SRCCOPY);
    SelectObject(hCompatibleDC, hOldBitmap);
    DeleteObject(hBitmap);
    DeleteDC(hCompatibleDC);
    ///
    switch (Message) {
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &PaintStruct);
        DeleteObject(hBitmap);
        DeleteDC(hCompatibleDC);
        EndPaint(hWnd, &PaintStruct);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);
}
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
12.06.2016, 21:25 #12
tiundv, все что написано на билдере в данном случае легко переносится на студию - просто воткните содержимое обработчика WM_PAINT в соответствующую секцию своей оконной процедуры
1
tiundv
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 22
12.06.2016, 21:33 #13
Да. я пытался но у меня не получается. постоянно какие то ошибки с классами и функциями. просто попробуйте сами если есть время. спасибо за ответ. для меня пока это все сложно но я буду копать
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,577
12.06.2016, 22:09 #14
tiundv, на днях попробую попробовать
1
tiundv
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 22
12.06.2016, 22:17 #15
vxg - Буду очень признателен
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2016, 22:17
Привет! Вот еще темы с ответами:

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

Воспроизведение видео - C++ WinAPI
Суть вот в чем: после совершения некого действия на консоли, нужно запустить окно, в котором будет проигрываться видео, и, желательно,...

Воспроизведение видео - C#
Подскажите что не так, ошибка когда нажимаю на PictureBox. using System; using System.Collections.Generic; using...

Воспроизведение видео - Lazarus
У меня windows 7 64 разрядная, установлен 64-х разрядный лазарус. В программе требуется воспроизвести несколько видео-фрагментов. Для этой...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
12.06.2016, 22:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru