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

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

22.04.2016, 15:21. Показов 54112. Ответов 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
22.04.2016, 17:26 2
FFMPEG после обработки напильником легко справляется с получением картинок из RTSP. Доставка на экран без проблем идёт через WM_PAINT. Сейчас не за ПК как будет время кину эскиз

Добавлено через 2 минуты
Но есть особенность. Тут часть что общается с FFMPEG лично мне в 6-м билдере собрать не удалось - выносил в DLL которую собирал в студии
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
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
Миниатюры
Воспроизведение видео с ip камеры  
Вложения
Тип файла: rar ffmpeg_test_bcb.rar (278.5 Кб, 232 просмотров)
Тип файла: rar ffmpeg_test.rar (224.9 Кб, 245 просмотров)
4
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 40
23.04.2016, 16:20  [ТС] 4
Ого! Спасибо! На неделе воспользуюсь материалом!
А что скажете на счет OpenCV!? Проще ли он!?
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
23.04.2016, 16:35 5
Цитата Сообщение от fademike Посмотреть сообщение
А что скажете на счет OpenCV!? Проще ли он!?
у меня сложилось впечатление что это очень сложная штука, но мне просто не нужно было делать те вещи которые он по описаниям умеет и я не стал связываться. привлекать его для масштабирования изображения излишне. приведенный код уже растягивает изображение до тех размеров которые вы ему укажите (сейчас это размеры окна)
0
64 / 64 / 16
Регистрация: 07.05.2016
Сообщений: 304
15.05.2016, 00:38 6
Мне интересно почему средствами opencv именно подавая поток в камеру не все камеры работают надлежайшим образом с rtsp? и еще зависит о камеры конкретной
0
0 / 0 / 0
Регистрация: 14.05.2016
Сообщений: 7
15.05.2016, 00:51 7
Привет ребята. У меня тоже есть чем поделится с вами - надеюсь будет полезно, единственное, придется попотеть, т.к. там без перевода, но Человек открыл многие просторы, ( не буду начинать с Чего, но Одно скажу, с помощью его можно в ВК делать что хошь,,, только я не скажу где у него это написано, просто в реальную тему отвечу, что вы разрабатываете, у него имеется, но все ни так просто, кароче вот вам адрес, читайте: Naughter
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
15.05.2016, 07:03 8
tibul, какого дьявола вы тут ребусы загадываете? Причём тут ВК? Вбивание указанного вами слова в Гугл даёт по теме ТС ноль.
0
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 40
19.05.2016, 12:31  [ТС] 9
vxg, спамит tibul, походу...
А Ваши исходники с ffmpeg я запустил и был в восторге от быстродействия! Он заработал как с rtsp так и с http!!
Скоро у меня появится камера с MJPEG и буду пытаться как-нибудь воспроизвести видео и с нее..
Еще раз спасибо огромное за исходнички!
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
19.05.2016, 13:16 10
Цитата Сообщение от fademike Посмотреть сообщение
Еще раз спасибо
на хабре есть статья о том из чего все это родилось Передача видео с глубоководного робота с ценными замечаниями как это все можно еще сильнее убыстрить. к сожалению большая часть замечаний упирается в "а вы пересоберите FFMPEG, купите железо с аппаратной поддержкой кодирования, перепишите код и вообще перейдите на DirectX" но некоторые моменты заставляют воображение работать
0
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
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
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
12.06.2016, 21:25 12
tiundv, все что написано на билдере в данном случае легко переносится на студию - просто воткните содержимое обработчика WM_PAINT в соответствующую секцию своей оконной процедуры
1
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
12.06.2016, 21:33 13
Да. я пытался но у меня не получается. постоянно какие то ошибки с классами и функциями. просто попробуйте сами если есть время. спасибо за ответ. для меня пока это все сложно но я буду копать
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
12.06.2016, 22:09 14
tiundv, на днях попробую попробовать
1
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
12.06.2016, 22:17 15
vxg - Буду очень признателен
0
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
14.06.2016, 10:49 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;
}
1
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
14.06.2016, 18:08 17
vxg - Большое спасибо вам. Завтра на работе проверю как камеру цепляет.

Добавлено через 9 минут
vxg и еще вопрос если можно.... зачем в функциях указывать второй void - (void init(void)). Осмысленного ответа для новичка не нашел.
0
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 40
15.06.2016, 12:45  [ТС] 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/");
1
Модератор
3382 / 2154 / 352
Регистрация: 13.01.2012
Сообщений: 8,364
15.06.2016, 14:09 19
fademike, имелось ввиду следующее: обязательно ли указывать ключевое слово void что бы компилятор понял что функция не имеет параметров или можно оставить пустые скобки
tiundv, как то так
В языке C для задания прототипа функции, не имеющей параметров, вместо списка параметров используется ключевое слово void. В языке C++ пустой список параметров в прототипе функция означает, что функция на имеет параметров. Слово void в этом случае необязательно.
с первым void который указывает на тип возвращаемого значения такой фокус лучше не делать
В версии C89, если тип данных возвращаемый функцией, явно не задан, то подразумевается тип int. В языке C++ и версии C99, тип int по умолчанию, не поддерживается, хотя в большинстве компиляторов C++ такое предположение остаётся в силе.
1
0 / 0 / 2
Регистрация: 25.05.2015
Сообщений: 28
16.06.2016, 18:50 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.

Если для этого исключения имеется обработчик, выполнение программы может быть продолжено безопасно.
0
16.06.2016, 18:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2016, 18:50
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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