Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 10.03.2016
Сообщений: 64

Перенос кода С++ из GraphEditPlus (DirectShow)

13.04.2017, 03:25. Показов 948. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. У меня возникла следующая проблема:
1.В GraphEditPlus собрал схему с фильтрами DirectShow и запросил сгенерировать код на C++ для этой схемы (В GraphEditPlus она работает).
2. Далее этот код запустил в Visual Studio. Компилируется без ошибок, и после запуска он не может собрать граф фильтров, ругаясь уже в самом консоле. (см. скриншот)
3. Я пытался закоментировать "CHECK_HR", который проверяет сам фильтр, но ошибка возникает далее с другим фильтром.
Если кто-нибудь работал вообще с кодами из GraphEditPlus, пожалуйста помогите. Заранее спасибо!
Вот сам код.
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
#include <SDKDDKVer.h>
#include <stdio.h>
#include <tchar.h>
#include <DShow.h>
#include <atlbase.h>
#include <initguid.h>
#include <dvdmedia.h>
 
 
#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "quartz.lib")
 
BOOL hrcheck(HRESULT hr, TCHAR* errtext)
{
    if (hr >= S_OK)
        return FALSE;
    TCHAR szErr[MAX_ERROR_TEXT_LEN];
    DWORD res = AMGetErrorText(hr, szErr, MAX_ERROR_TEXT_LEN);
    if (res)
        printf("Error %x: %s\n%s\n", hr, errtext, szErr);
    else
        printf("Error %x: %s\n", hr, errtext);
    return TRUE;
}
 
#define CHECK_HR(hr, msg) if (hrcheck(hr, msg)) return hr;
 
CComPtr<IPin> GetPin(IBaseFilter *pFilter, LPCOLESTR pinname)
{
    CComPtr<IEnumPins> pEnum;
    CComPtr<IPin> pPin;
    HRESULT hr = pFilter->EnumPins(&pEnum);
    if (hrcheck(hr, "Can't enumerate pins."))
        return NULL;
    while (pEnum->Next(1, &pPin, 0) == S_OK)
    {
        PIN_INFO pinfo;
        pPin->QueryPinInfo(&pinfo);
        BOOL found = !wcsicmp(pinname, pinfo.achName);
        if (pinfo.pFilter) pinfo.pFilter->Release();
        if (found)
            return pPin;
        pPin.Release();
    }
    printf("Pin not found!\n");
    return NULL;
}
 
DEFINE_GUID(CLSID_Mpeg4sDecoderDMO,
            0x94297043, 0xBD82, 0x4DFD, 0xB0, 0xDE, 0x81, 0x77, 0x73, 0x9C, 0x6D, 0x20); //qasf.dll
DEFINE_GUID(CLSID_MP3DecoderDMO,
            0x94297043, 0xBD82, 0x4DFD, 0xB0, 0xDE, 0x81, 0x77, 0x73, 0x9C, 0x6D, 0x20); //qasf.dll
DEFINE_GUID(CLSID_VideoRenderer,
            0xB87BEB7B, 0x8D29, 0x423F, 0xAE, 0x4D, 0x65, 0x82, 0xC1, 0x01, 0x75, 0xAC); //quartz.dll
        
HRESULT BuildGraph(IGraphBuilder *pGraph, LPCOLESTR srcFilel, LPCOLESTR srcFile2)
{
    HRESULT hr = S_OK;
 
    CComPtr<ICaptureGraphBuilder2> pBuilder;
    hr = pBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder2);
    CHECK_HR(hr, "Can't create Capture Graph Builder");
    hr = pBuilder->SetFiltergraph(pGraph);
    CHECK_HR(hr, "Can't SetFiltergraph");
 
    CComPtr<IBaseFilter> pAVIWAVFileSource;
    hr = pAVIWAVFileSource.CoCreateInstance(CLSID_AVIDoc);
    CHECK_HR(hr, "Can't create AVI/WAV File Source");
    hr = pGraph->AddFilter(pAVIWAVFileSource, L"AVI/WAV File Source");
    CHECK_HR(hr, "Can't add AVI/WAV File Source to graph");
 
    CComQIPtr<IFileSourceFilter, &IID_IFileSourceFilter> pAVIWAVFileSource_src(pAVIWAVFileSource);
    if (!pAVIWAVFileSource_src)
        CHECK_HR(E_NOINTERFACE, "Can't get IFileSourceFilter");
    hr = pAVIWAVFileSource_src->Load(srcFilel, NULL);
    CHECK_HR(hr, "Can't load file");
 
    CComPtr<IBaseFilter> pMpeg4sDecoderDMO;
    hr = pMpeg4sDecoderDMO.CoCreateInstance(CLSID_Mpeg4sDecoderDMO);
    CHECK_HR(hr, "Can't create Mpeg43 Decoder DMO");
    hr = pGraph->AddFilter(pMpeg4sDecoderDMO, L"Mpegés Decoder DMO");
    CHECK_HR(hr, "Can't add Mpegés Decoder DMO to graph");
 
    CComPtr<IBaseFilter> pMPEGIStreamSplitter;
    hr = pMPEGIStreamSplitter.CoCreateInstance(CLSID_MPEG1Splitter);
    CHECK_HR(hr, "Can't create MPEG-I Stream Splitter");
    hr = pGraph->AddFilter(pMPEGIStreamSplitter, L"MPEG-I Stream Splitter");
    CHECK_HR(hr, "Can't add MPEG-I Stream Splitter to graph");
 
    hr = pGraph->ConnectDirect(GetPin(pAVIWAVFileSource, L"Angely.i.Demony.2009.D.HDRip.avi"), GetPin(pMpeg4sDecoderDMO, L"in0"), NULL);
    CHECK_HR(hr, "Can't connect AVI/WAV File Source and Mpeg4s Decoder DMO");
 
    CComPtr<IBaseFilter> pAVIDecompressor;
    hr = pAVIDecompressor.CoCreateInstance(CLSID_AVIDec);
    CHECK_HR(hr, "Can't create AVI Decompressor");
    hr = pGraph->AddFilter(pAVIDecompressor, L"AVI Decompressor");
    CHECK_HR(hr, "Can't add AVI Decompressor to graph");
 
    CComPtr<IBaseFilter> pMP3DecoderDMO;
    hr = pMP3DecoderDMO.CoCreateInstance(CLSID_MP3DecoderDMO);
    CHECK_HR(hr, "Can't create MP3 Decoder DMO");
    hr = pGraph->AddFilter(pMP3DecoderDMO, L"MP3 Decoder DMO");
    CHECK_HR(hr, "Can't add MP3 Decoder DMO to graph");
 
    hr = pGraph->ConnectDirect(GetPin(pMPEGIStreamSplitter, L"Audio"), GetPin(pMP3DecoderDMO, L"in0"), NULL);
    CHECK_HR(hr, "Can't connect MPEG-I Stream Splitter and MP3 Decoder DMO");
 
    hr = pGraph->ConnectDirect(GetPin(pMpeg4sDecoderDMO, L"out0"), GetPin(pAVIDecompressor, L"XForm In"), NULL);
    CHECK_HR(hr, "Can't connect Mpeg43 Decoder DMO and AVI Decompressor");
 
    CComPtr<IBaseFilter> pDefaultDirectSoundDevice;
    hr = pDefaultDirectSoundDevice.CoCreateInstance(CLSID_DSoundRender);
    CHECK_HR(hr, "Can't create Default DirectSound Device");
    hr = pGraph->AddFilter(pDefaultDirectSoundDevice, L"Default DirectSound Device");
    CHECK_HR(hr, "Can't add Default DirectSound Device to graph");
 
    CComPtr<IBaseFilter> pColorSpaceConverter;
    hr = pColorSpaceConverter.CoCreateInstance(CLSID_Colour);
    CHECK_HR(hr, "Can't create Color Space Converter");
    hr = pGraph->AddFilter(pColorSpaceConverter, L"Color Space Converter");
    CHECK_HR(hr, "Can't add Color Space Converter to graph");
 
    hr = pGraph->ConnectDirect(GetPin(pMP3DecoderDMO, L"out0"), GetPin(pDefaultDirectSoundDevice, L"Audio Input pin (rendered)"), NULL);
    CHECK_HR(hr, "Can't connect MP3 Decoder DMO and Default DirectSound Device");
 
    hr = pGraph->ConnectDirect(GetPin(pAVIDecompressor, L"XForm Out"), GetPin(pColorSpaceConverter, L"Input"), NULL);
    CHECK_HR(hr, "Can't connect AVI Decompressor and Color Space Converter");
 
    CComPtr<IBaseFilter> pVideoRenderer;
    hr = pVideoRenderer.CoCreateInstance(CLSID_VideoRenderer);
    CHECK_HR(hr, "Can't create Video Renderer");
    hr = pGraph->AddFilter(pVideoRenderer, L"Video Renderer");
    CHECK_HR(hr, "Can't add Video Renderer to graph");
 
    hr = pGraph->ConnectDirect(GetPin(pColorSpaceConverter, L"XForm Out"), GetPin(pVideoRenderer, L"VMR InputO"), NULL);
    CHECK_HR(hr, "Can't connect Color Space Converter and Video Renderer");
 
    CComPtr<IBaseFilter> pFileSourceAsync2;
    hr = pFileSourceAsync2.CoCreateInstance(CLSID_AsyncReader);
    CHECK_HR(hr, "Can't create File Source (Async.)");
    hr = pGraph->AddFilter(pFileSourceAsync2, L"File Source(Async.)");
    CHECK_HR(hr, "Can't add File Source (A3ync.) to graph");
    CComQIPtr<IFileSourceFilter, &IID_IFileSourceFilter> pFileSourceAsync2_src(pFileSourceAsync2);
    if (!pFileSourceAsync2_src)
        CHECK_HR(E_NOINTERFACE, "Can't get IFileSourceFilter");
    hr = pFileSourceAsync2_src->Load(srcFile2, NULL);
    CHECK_HR(hr, "Can't load file");
 
    hr = pGraph->ConnectDirect(GetPin(pFileSourceAsync2, L"Output"), GetPin(pMPEGIStreamSplitter, L"Input"), NULL);
    CHECK_HR(hr, "Can't connect File Source (Async.) and MPEG-I Stream Splitter");
 
    return S_OK;
}
 
int _tmain(int argc, TCHAR* argv[])
{
    CoInitialize(NULL);
    CComPtr<IGraphBuilder> graph;
    graph.CoCreateInstance(CLSID_FilterGraph);
    printf("Building graph...\n");
    HRESULT hr = BuildGraph(graph, L"D:\\Angely.i.Demony.2009.D.HDRip.avi", L"D:\\Dead Poetic - New Medicine.mp3");
    if (hr == S_OK){
        printf("Running");
        CComQIPtr<IMediaControl, &IID_IMediaControl> mediaControl(graph);
        hr = mediaControl->Run();
        CHECK_HR(hr, "Can't run the graph");
        CComQIPtr<IMediaEvent, &IID_IMediaEvent> mediaEvent(graph);
        BOOL stop = FALSE;
        MSG msg;
        while (!stop)
        {
            long ev = 0, p1 = 0, p2 = 0;
            Sleep(500);
            printf(".");
            while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                    DispatchMessage(&msg);
            while (mediaEvent->GetEvent(&ev, &p1, &p2, 0) == S_OK)
            {
                if (ev == EC_COMPLETE || ev == EC_USERABORT)
                {
                    printf("Done!\n");
                    stop = TRUE;
                }
                else if (ev == EC_ERRORABORT)
                {
                    printf("An error occured: HRESULT=%x\n", p1);
                    mediaControl->Stop();
                    stop = TRUE;
            }
            mediaEvent->FreeEventParams(ev, p1, p2);
        }
    }
}
CoUninitialize();
getchar();
return 0;
}
Миниатюры
Перенос кода С++ из GraphEditPlus (DirectShow)  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.04.2017, 03:25
Ответы с готовыми решениями:

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

перенос кода в С++
var e,x,t,s:real; n:integer; begin repeat write('|x|&lt;1 x='); read(x); until abs(x)&lt;1; repeat write('0&lt;e&lt;1 e='); ...

Перенос кода на C++11
Здравствуйте! Я столкнулся со следующей проблемой: есть проект под Android, большая часть которого написана на С++. В команде...

1
2 / 2 / 0
Регистрация: 10.03.2016
Сообщений: 64
13.04.2017, 13:16  [ТС]
Через точку остановы нашел такую информацию, что в переменные графа ничего не записывается, а пишет:
"Информация недоступна, символы для quartz.dll/qasf.all не загружены", но quartz.lib подключена.
Помогите пожалуйста, как можно это исправить.
Миниатюры
Перенос кода С++ из GraphEditPlus (DirectShow)  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2017, 13:16
Помогаю со студенческими работами здесь

Перенос кода
Подскажите пожалуйста в чём проблема? имею код: func.cpp #ifndef LAB4_H #define LAB4_H #include...

перенос кода из VB
Подскажите, как перенести данный код из VB в Builder? myhead = createobject('eapi.head') myhead.open set myresultset =...

Перенос кода
Есть у меня код на Delphi, мне нужно перенести его на c++, работаю в visual studio 2019. Сам код при нажатии по кнопке ищет вписанное в...

GraphEditPlus - при подключении карты видеозахвата, вылетает ошибка "устройство не подключено"
Товарищи, пишу приложение работы с видео. Почитав, решил использовать библиотеку DirectShow. Все написалось хорошо. Подключаю любую вебку,...

Перенос кода из vb 6 в vb 2008
здравствуйте, у меня возникла серьёзная проблема. Сам я с vb знаком постольку поскольку (в основном delphi) но возникла необходимость в...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru