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

C++: COM, OLE, ActiveX

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

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

22.04.2016, 15:21. Просмотров 3004. Ответов 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 с интерполяцией!?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2016, 15:21     Воспроизведение видео с ip камеры
Посмотрите здесь:

дырка для захвата видео с видео камеры
C++ DirectShow: захват видео с веб-камеры, воспроизведение
Софт Как сделать так что бы обычное видео из жесткого диска подавалось как видео с вэб-камеры?
Java: воспроизведение видео JavaFX
DirectX Наложить видео с альфа каналом поверх картинки с камеры, чтобы видео не перекрывало картинку
C# Воспроизведение видео
Воспроизведение видео Delphi
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3052 / 1854 / 194
Регистрация: 13.01.2012
Сообщений: 7,062
22.04.2016, 17:26     Воспроизведение видео с ip камеры #2
FFMPEG после обработки напильником легко справляется с получением картинок из RTSP. Доставка на экран без проблем идёт через WM_PAINT. Сейчас не за ПК как будет время кину эскиз

Добавлено через 2 минуты
Но есть особенность. Тут часть что общается с FFMPEG лично мне в 6-м билдере собрать не удалось - выносил в DLL которую собирал в студии
vxg
Модератор
3052 / 1854 / 194
Регистрация: 13.01.2012
Сообщений: 7,062
23.04.2016, 00:37     Воспроизведение видео с ip камеры #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
Миниатюры
Воспроизведение видео с ip камеры  
Вложения
Тип файла: rar ffmpeg_test_bcb.rar (278.5 Кб, 40 просмотров)
Тип файла: rar ffmpeg_test.rar (224.9 Кб, 49 просмотров)
fademike
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 24
23.04.2016, 16:20  [ТС]     Воспроизведение видео с ip камеры #4
Ого! Спасибо! На неделе воспользуюсь материалом!
А что скажете на счет OpenCV!? Проще ли он!?
vxg
Модератор
3052 / 1854 / 194
Регистрация: 13.01.2012
Сообщений: 7,062
23.04.2016, 16:35     Воспроизведение видео с ip камеры #5
Цитата Сообщение от fademike Посмотреть сообщение
А что скажете на счет OpenCV!? Проще ли он!?
у меня сложилось впечатление что это очень сложная штука, но мне просто не нужно было делать те вещи которые он по описаниям умеет и я не стал связываться. привлекать его для масштабирования изображения излишне. приведенный код уже растягивает изображение до тех размеров которые вы ему укажите (сейчас это размеры окна)
starkiron
63 / 63 / 10
Регистрация: 07.05.2016
Сообщений: 304
15.05.2016, 00:38     Воспроизведение видео с ip камеры #6
Мне интересно почему средствами opencv именно подавая поток в камеру не все камеры работают надлежайшим образом с rtsp? и еще зависит о камеры конкретной
tibul
0 / 0 / 0
Регистрация: 14.05.2016
Сообщений: 7
15.05.2016, 00:51     Воспроизведение видео с ip камеры #7
Привет ребята. У меня тоже есть чем поделится с вами - надеюсь будет полезно, единственное, придется попотеть, т.к. там без перевода, но Человек открыл многие просторы, ( не буду начинать с Чего, но Одно скажу, с помощью его можно в ВК делать что хошь,,, только я не скажу где у него это написано, просто в реальную тему отвечу, что вы разрабатываете, у него имеется, но все ни так просто, кароче вот вам адрес, читайте: Naughter
vxg
Модератор
3052 / 1854 / 194
Регистрация: 13.01.2012
Сообщений: 7,062
15.05.2016, 07:03     Воспроизведение видео с ip камеры #8
tibul, какого дьявола вы тут ребусы загадываете? Причём тут ВК? Вбивание указанного вами слова в Гугл даёт по теме ТС ноль.
fademike
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 24
19.05.2016, 12:31  [ТС]     Воспроизведение видео с ip камеры #9
vxg, спамит tibul, походу...
А Ваши исходники с ffmpeg я запустил и был в восторге от быстродействия! Он заработал как с rtsp так и с http!!
Скоро у меня появится камера с MJPEG и буду пытаться как-нибудь воспроизвести видео и с нее..
Еще раз спасибо огромное за исходнички!
vxg
Модератор
3052 / 1854 / 194
Регистрация: 13.01.2012
Сообщений: 7,062
19.05.2016, 13:16     Воспроизведение видео с ip камеры #10
Цитата Сообщение от fademike Посмотреть сообщение
Еще раз спасибо
на хабре есть статья о том из чего все это родилось Передача видео с глубоководного робота с ценными замечаниями как это все можно еще сильнее убыстрить. к сожалению большая часть замечаний упирается в "а вы пересоберите FFMPEG, купите железо с аппаратной поддержкой кодирования, перепишите код и вообще перейдите на DirectX" но некоторые моменты заставляют воображение работать
tiundv
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 22
12.06.2016, 16:48     Воспроизведение видео с ip камеры #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);
}
vxg
Модератор
3052 / 1854 / 194
Регистрация: 13.01.2012
Сообщений: 7,062
12.06.2016, 21:25     Воспроизведение видео с ip камеры #12
tiundv, все что написано на билдере в данном случае легко переносится на студию - просто воткните содержимое обработчика WM_PAINT в соответствующую секцию своей оконной процедуры
tiundv
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 22
12.06.2016, 21:33     Воспроизведение видео с ip камеры #13
Да. я пытался но у меня не получается. постоянно какие то ошибки с классами и функциями. просто попробуйте сами если есть время. спасибо за ответ. для меня пока это все сложно но я буду копать
vxg
Модератор
3052 / 1854 / 194
Регистрация: 13.01.2012
Сообщений: 7,062
12.06.2016, 22:09     Воспроизведение видео с ip камеры #14
tiundv, на днях попробую попробовать
tiundv
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 22
12.06.2016, 22:17     Воспроизведение видео с ip камеры #15
vxg - Буду очень признателен
vxg
Модератор
3052 / 1854 / 194
Регистрация: 13.01.2012
Сообщений: 7,062
14.06.2016, 10:49     Воспроизведение видео с ip камеры #16
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
#include <windows.h>
 
//---------------------------------------------------------------------------
HWND hWnd;
 
int buffer_w, buffer_h;
 
char *form_bmp_bits;
HBITMAP form_bmp_h;
 
void create_frame_buffer(void);
void destroy_frame_buffer(void);
//---------------------------------------------------------------------------
#include "ffmpeg_test.h"
//---------------------------------------------------------------------------
void cb_fn(void)
{
    ffmpeg_test_get_bmp(form_bmp_bits, buffer_w, buffer_h);
    InvalidateRect(hWnd, NULL, FALSE);    
}
//---------------------------------------------------------------------------
void 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 destroy_frame_buffer(void)
{
    DeleteObject(form_bmp_h);
}
//---------------------------------------------------------------------------
void init(void)
{
    create_frame_buffer();
 
    ffmpeg_test_start("rtsp://127.0.0.1:8554/", cb_fn);
}
//---------------------------------------------------------------------------
void 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 uninit(void)
{
    ffmpeg_test_stop();
 
    destroy_frame_buffer();
}
//---------------------------------------------------------------------------
 
LRESULT CALLBACK PictViewWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam) {
    switch (Message) {
    case WM_PAINT:
        paint();
        return 0;
    case WM_DESTROY:
        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;
    }
 
    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);
 
    RECT rect;
    GetWindowRect(hWnd, &rect);
    buffer_w = rect.right - rect.left;
    buffer_h = rect.bottom - rect.top;
 
    init();
    while (GetMessage(&Msg, NULL, 0, 0)) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
tiundv
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 22
14.06.2016, 18:08     Воспроизведение видео с ip камеры #17
vxg - Большое спасибо вам. Завтра на работе проверю как камеру цепляет.

Добавлено через 9 минут
vxg и еще вопрос если можно.... зачем в функциях указывать второй void - (void init(void)). Осмысленного ответа для новичка не нашел.
fademike
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 24
15.06.2016, 12:45  [ТС]     Воспроизведение видео с ip камеры #18
Цитата Сообщение от tiundv Посмотреть сообщение
зачем в функциях указывать второй void - (void init(void)).
Второй void- это параметр, который принимает функция "init" (в данном случае ничего).
если не void, то например как то так:
C
1
2
3
4
5
void init(char * str)
{
    create_frame_buffer();
    ffmpeg_test_start(str, cb_fn);
}
а вызов: init("rtsp://127.0.0.1:8554/");
vxg
Модератор
3052 / 1854 / 194
Регистрация: 13.01.2012
Сообщений: 7,062
15.06.2016, 14:09     Воспроизведение видео с ip камеры #19
fademike, имелось ввиду следующее: обязательно ли указывать ключевое слово void что бы компилятор понял что функция не имеет параметров или можно оставить пустые скобки
tiundv, как то так
В языке C для задания прототипа функции, не имеющей параметров, вместо списка параметров используется ключевое слово void. В языке C++ пустой список параметров в прототипе функция означает, что функция на имеет параметров. Слово void в этом случае необязательно.
с первым void который указывает на тип возвращаемого значения такой фокус лучше не делать
В версии C89, если тип данных возвращаемый функцией, явно не задан, то подразумевается тип int. В языке C++ и версии C99, тип int по умолчанию, не поддерживается, хотя в большинстве компиляторов C++ такое предположение остаётся в силе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2016, 18:50     Воспроизведение видео с ip камеры
Еще ссылки по теме:

C# Воспроизведение видео
C++ WinAPI Обработка видео с камеры видео наблюдения (для экспертов)
Воспроизведение видео Lazarus
C++ COM DirectShow, проиграть видео в своем окне?
Воспроизведение видео в Delphi Delphi

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

Или воспользуйтесь поиском по форуму:
tiundv
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 22
16.06.2016, 18:50     Воспроизведение видео с ip камеры #20
Спасибо ребята за обьяснение. Если можно то помогите еще.... Пытался вывести видео с камеры в дочернее окно... куча ошибок...Помогите пожалуйста. И вторая просьба...- Не могли бы вы обьяснить что за метод "static DWORD WINAPI proc(LPVOID arg)" что он делает ? И обязательно ли использовать "DECL_SPEC" ? Ниже мой код вывода дочерних окон и ошибки при запуске....
ffmpeg_test.h
Кликните здесь для просмотра всего текста
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
#pragma once
 
//------------------------------------------------------------------------------
//ffmpeg_test 1.0
//------------------------------------------------------------------------------
#ifndef ffmpeg_test_h
#define ffmpeg_test_h
//------------------------------------------------------------------------------
#include <windows.h>
#include <windowsx.h>
#include <fstream>
#include <string>
#include<iostream>
#include <conio.h>
#include <stdio.h>
#include <vector>
using namespace std;
//------------------------------------------------------------------------------
#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
#define ID_FIRSTCHILD   100
#define ID_SECONDCHILD  101
#define ID_THIRDCHILD   102
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK PictViewWndProc(HWND, UINT, UINT, LONG);
void init(void);
void paint(void);
void uninit(void);

main.cpp
Кликните здесь для просмотра всего текста
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
#include "ffmpeg_test.h"
 
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
HWND hWnd;
 
int buffer_w, buffer_h;
 
char *form_bmp_bits;
HBITMAP form_bmp_h;
 
void create_frame_buffer(void);
void destroy_frame_buffer(void);
//char readFile(char *fName, int arg);
//char readFile2(char *fName, int arg);
//wstring s2ws(const string& str);
 
HINSTANCE hinst;
//---------------------------------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASS w;
    hinst = hInstance;
    memset(&w, 0, sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = PictViewWndProc;
    w.hInstance = hInstance;
    w.hbrBackground = GetStockBrush(WHITE_BRUSH);
    w.lpszClassName = TEXT("C Windows");
    w.hCursor = LoadCursor(NULL, IDC_ARROW);
    RegisterClass(&w);
    hwnd = CreateWindow(TEXT("C Windows"), TEXT("C Windows"), WS_OVERLAPPEDWINDOW,
        10, 10, 600, 480, NULL, NULL, hInstance, NULL);
    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, WPARAM wparam, LPARAM lparam)
{
    RECT rcClient;
    int i;
    switch (Message)
    {
    case WM_CREATE: // создание основного окна
        for (int i = 0; i < 3; i++) // Создание трех  дочерних окна
        {
            WNDCLASS w;
            memset(&w, 0, sizeof(WNDCLASS));
            w.lpfnWndProc = ChildProc;
            w.hInstance = hinst;
            w.hbrBackground = GetStockBrush(WHITE_BRUSH);
            w.lpszClassName = TEXT("ChildWClass");
            w.hCursor = LoadCursor(NULL, IDC_CROSS);
            RegisterClass(&w);
            HWND child;
            child = CreateWindowEx(0, TEXT("ChildWClass"), (LPCTSTR)NULL,
                WS_CHILD | WS_BORDER | WS_VISIBLE, i * 50, i * 50,
                50, 50, hwnd, (HMENU)(int)(ID_FIRSTCHILD + i), hinst, NULL);
            ShowWindow(child, SW_NORMAL);
            UpdateWindow(child);
            RECT rect;
            GetWindowRect(hWnd, &rect);
            buffer_w = rect.right - rect.left;
            buffer_h = rect.bottom - rect.top;
 
            init();
        }
        return 0;
    case WM_SIZE:   // изменение размеров основного окна
                    // Получает габариты рабочей области главного окна и перечисляет дочерние окна.
                    // Передает габариты в дочерние окна в ходе перечисления.
        GetClientRect(hwnd, &rcClient);
        EnumChildWindows(hwnd, EnumChildProc, (LPARAM)&rcClient);
        return 0;
    }
    if (Message == WM_DESTROY)
    {
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, Message, wparam, lparam);
}
//---------------------------------------------------------------------------
LRESULT CALLBACK ChildProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    switch (Message) {
    case WM_PAINT:
        paint();
        return 0;
    case WM_DESTROY:
        uninit();
        PostQuitMessage(0);
        return 0;
    }
    /*if (Message == WM_DESTROY)
    {
        return 0;
    }*/
    return DefWindowProc(hwnd, Message, wparam, lparam);
}
//---------------------------------------------------------------------------
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
    LPRECT rcParent;
    int i, idChild;
    // Восстановление идентификатора дочернего окна.
    // Использовать его для установки дочернего окна.
    idChild = GetWindowLong(hwndChild, GWL_ID);
    if (idChild == ID_FIRSTCHILD)
        i = 0;
    else if (idChild == ID_SECONDCHILD)
        i = 1;
    else
        i = 2;
    // Размер и позиция дочернего окна.
    rcParent = (LPRECT)lParam;
    MoveWindow(hwndChild, (rcParent->right / 3) * i, 0, rcParent->right / 3, rcParent->bottom, TRUE);
    // Удостоверитесь, что дочернее окно видимо
    ShowWindow(hwndChild, SW_SHOW);
    return TRUE;
}
//---------------------------------------------------------------------------
void cb_fn(void)
{
    ffmpeg_test_get_bmp(form_bmp_bits, buffer_w, buffer_h);
    InvalidateRect(hWnd, NULL, FALSE);
}
//---------------------------------------------------------------------------
void 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 destroy_frame_buffer(void)
{
    DeleteObject(form_bmp_h);
}
//---------------------------------------------------------------------------
void init(void)
{
    create_frame_buffer();
    ffmpeg_test_start("rtsp://admin:admin@192.168.1.108:554/cam/realmonitor?channel=1&subtype=0", cb_fn);
}
//---------------------------------------------------------------------------
void 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 uninit(void)
{
    ffmpeg_test_stop();
 
    destroy_frame_buffer();
}

При сборке выдает предупреждения:
Кликните здесь для просмотра всего текста
CSS
1
2
3
4
1>     Создается библиотека D:\_PROJECTS\VSProjects\Win32Project2\Debug\Win32Project2.lib и объект D:\_PROJECTS\VSProjects\Win32Project2\Debug\Win32Project2.exp
1>main.obj : warning LNK4217: локально определенный символ _ffmpeg_test_start@8 импортирован в функцию "void __cdecl init(void)" (?init@@YAXXZ)
1>main.obj : warning LNK4217: локально определенный символ _ffmpeg_test_stop@0 импортирован в функцию "void __cdecl uninit(void)" (?uninit@@YAXXZ)
1>main.obj : warning LNK4217: локально определенный символ _ffmpeg_test_get_bmp@12 импортирован в функцию "void __cdecl cb_fn(void)" (?cb_fn@@YAXXZ)

При отладке без подключенной камеры ошибок нет но процесс попадает сразу в фоновые. При подключеной камере ошибки такие:
Кликните здесь для просмотра всего текста
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>   Win32Project2.exe!ffmpeg_test_get_bmp(void * bmp_bits, int w, int h)Строка 129  C++
        bmp_bits    0x00000000  void *
+       codec_ctx   0x038d08e0 {av_class=avcodec-57.dll!0x10b834e0 {class_name=0x10b834c0 "AVCodecContext" item_name=avcodec-57.dll!0x0fcafae0 ...} ...}    AVCodecContext *
        codec_ctx->height   720 int
0x05068220 {data=0x05068220 {0x0683d040 "lnqrrruxwwuttrsrtpptuzxyzzxxy{{yx{xsstqollnnmmkkkhghidfhc^^]\\^[YWSTSQNLMNNMKKLNPRUW[[VUVRPOONKLKJMGKLGHJJJKLLLNPQRTWTTVTTWVWWWWXXXYY[\\VXXYYYZ[\\]^^^[[^_^_^]_a^aaabba_ddefffffffhifeighfefghiijjjjjjkklmm..., ...} ...}
>   Win32Project2.exe!cb_fn()Строка 137 C++
        buffer_h    0   int
        buffer_w    0   int
+       form_bmp_bits   0x00000000 <NULL>   char *
>   Win32Project2.exe!proc(void * arg)Строка 43 C++
+       &finished   0x0673f7f0 {1}  int *
+       &packet 0x0673f7fc {buf=0x04251fc0 {buffer=0x0348dde0 {...} data=0x052281a0 "" size=49127 } pts=18000 dts=18000 ...}    AVPacket *
+       codec_ctx   0x038d08e0 {av_class=avcodec-57.dll!0x10b834e0 {class_name=0x10b834c0 "AVCodecContext" item_name=avcodec-57.dll!0x0fcafae0 ...} ...}    AVCodecContext *
        finished    1   int
+       frame   0x05068220 {data=0x05068220 {0x0683d040 "lnqrrruxwwuttrsrtpptuzxyzzxxy{{yx{xsstqollnnmmkkkhghidfhc^^]\\^[YWSTSQNLMNNMKKLNPRUW[[VUVRPOONKLKJMGKLGHJJJKLLLNPQRTWTTVTTWVWWWWXXXYY[\\VXXYYYZ[\\]^^^[[^_^_^]_a^aaabba_ddefffffffhifeighfefghiijjjjjjkklmm..., ...} ...}  AVFrame *

При остановке отладки уведомляет так:
Кликните здесь для просмотра всего текста
CSS
1
Вызвано исключение по адресу 0x00AD665A (swscale-4.dll) в Win32Project2.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000038.

Это малая часть ошибок...
Прошу вас помочь !!!
За ранее СПАСИБО !!!

Добавлено через 16 минут
Попробовал одно дочерное окно вывести и при отладке выскакивает окно где написано:
Кликните здесь для просмотра всего текста
Вызвано исключение по адресу 0x0FEF665A (swscale-4.dll) в Win32Project2.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000038.

Если для этого исключения имеется обработчик, выполнение программы может быть продолжено безопасно.
Yandex
Объявления
16.06.2016, 18:50     Воспроизведение видео с ip камеры
Ответ Создать тему
Опции темы

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