Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
Завершенные тесты: 1
1

Самый простой вопрос на сегодня.

10.09.2011, 18:29. Просмотров 571. Ответов 4
Метки нет (Все метки)

Простейшая задача. Я думал справится за пару минут в купе с google, но что-то как-то не срослось =( Вспомнился этот форум.

В общем, задача, как я уже говорил, элементарнейшая. Есть микрофон, нужно чтобы он что-нить записал и тут же всё это воспроизвёл. Проблема в том, что я нифига не вкуриваю, а в планах ещё этот трек как-то изменять (например, повысить тембр, высоту или какие там ещё музыкальные термины?) и опять же всё это воспроизводить. Что-то вроде караоке, короче =)

Я так понял, что нужно возится с такой элементарной вещью, как DirectShow. Огромные возможности этой.., Вики говорит, что это - API, позволяют ей создавать такие фильтры в мгновение ока, что любой профи откинет челюсть.

Окей, не будем о грустном. Сейчас надо, я так понял, взять звуко-поток (или что там?) и запихнуть его в буфер (или как там выражаться), а вот как это делать, я так и не понял.

Из вики копирнул, подправил (очень даже не много, надо сказать) и заработало это:
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
//---------------------------------------------------------------------------
#include <iostream>
#include <stdio.h>
#include <dshow.h>
#pragma comment(lib, "strmiids.lib")
//---------------------------------------------------------------------------
char * pcFileName = "C:\\Users\\[конспирация]\\Videos\\test.avi";
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    IGraphBuilder * pGraph(NULL);    //Интерфейс менеджера графа-фильтров
    IMediaControl * pControl(NULL);  //Интерфейс управления
    IMediaEvent   * pEvent(NULL);    //Интерфейс сообщений
 
    //Инициализация библиотеки COM
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    if(SUCCEEDED(hr))  
    {
        //Создание менеджера графа-фильтров
        hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
                                IID_IGraphBuilder, (void **)&pGraph);
        if(SUCCEEDED(hr))
        {
            //Получение интерфейса управления
            hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
            if(SUCCEEDED(hr))
            {
                //Получение интерфейса сообщений
                hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
                if(SUCCEEDED(hr))
                {
                    //Загрузка файла (Внимание! Unicode)
                    WCHAR wFileName[MAX_PATH];
                    MultiByteToWideChar(CP_ACP, 0, pcFileName, -1, wFileName, MAX_PATH);
                    hr = pGraph->RenderFile((LPCWSTR)wFileName, NULL);
 
                    //Для не Unicode
                    //hr = pGraph->RenderFile((LPCWSTR)pcFileName, NULL);
 
                    if(SUCCEEDED(hr))
                    {
                        //Запуск воспроизведения
                        hr = pControl->Run();
                        if(SUCCEEDED(hr))
                        {
                            //В реальном приложении INFINITE лучше не использовать
                            long evCode;
                            pEvent->WaitForCompletion(INFINITE, &evCode);
                        }
 
                        //Остановка графа-фильтров
                        hr = pControl->Stop();
                    }
                }
                else
                {
                    printf("Ошибка: не удаётся получить интерфейс сообщений медиа!");
                }
            }
            else
            {
                printf("Ошибка: не удаётся получить интерфейс управления медиа!");
            }
        }
        else
        {
            printf("Ошибка: не удаётся создать менеджер графа-фильтров!");
        }
 
        //Освобождаем ресурсы
        if(pControl) pControl->Release();
        if(pEvent)   pEvent->Release();
        if(pGraph)   pGraph->Release();
 
        CoUninitialize();
    }
    else
    {
        printf("Ошибка: не удаётся инициализировать библиотеку COM!");
    }
 
    return hr;
}
//---------------------------------------------------------------------------
Но больше, собственно, я ничего не запустил. Более того, все эти функции, константы, переменные, указатели ровным счётом ни о чём не говорят. Почему? Да потому что я увяз в "спортивном" программировании и никак не могу освоить профессиональность. Собственно, вот начинаю потихоньку. После того как в СПбГУ ИТМО мне промыли мозги графами, деревьями и ёлками, бинарными поисками и быстрыми преобразованиями Фурье (шучу, этого не было). В общем - после промывки мозгов этой дремучей смесью, я не могу ДАЖЕ залинковать и подключить библиотеку. Вообще никак. Где-то неделю искал себе задачку, которая НЕ требует этого и вот нашёл. Не буду пояснять суть задачи глобально, дабы не было "тривиальных" решений на иходниках.где_то_в_ин-те.нет... Поэтому и ставлю задачу только записать и тут же воспроизвести.


Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2011, 18:29
Ответы с готовыми решениями:

самый простой вопрос который мог задать нуб!не получается подсчет слов!!!!!
int wordCount(string a){ int i,c,n; c=n=0; i=1; while((c=a)!='\0'){...

Самый самый самый простой пример рекурсии
приведите самый прост пример рекурсии)))void main(int k) { int n=10; k=n;...

Самый простой односвязный список
Здравствуйте. Найдите ошибки или помогите полностью написать самый простой...

Самый простой способ создать таблицу
подскажите пожалуйста как можно сделать таблицу, прошу привести пример, даже...

Нужно создать самый простой класс (С++)
Самый обыкновенный класс, любой.

4
xAtom
918 / 743 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
10.09.2011, 19:55 2
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Есть микрофон, нужно чтобы он что-нить записал и тут же всё это воспроизвёл. Проблема в том, что я нифига не вкуриваю, а в планах ещё этот трек как-то изменять (например, повысить тембр, высоту или какие там ещё музыкальные термины?) и опять же всё это воспроизводить. Что-то вроде караоке, короче =)
Вся суть сводиться не в использование DirectShow для записи звука, вообще графы чистому потоку RIFF не нужны, кодировать/декодировать здесь вообще ничего не надо, для этого копай в сторону DirectSound там есть всё что нужно захват потока данных с микрофона и его воспроизведения или сохранения, можно изменять данные потока увеличивать или уменьшать громкость, добавлять эхо и т.д.
0
AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
Завершенные тесты: 1
10.09.2011, 20:24  [ТС] 3
Собственно говоря, поиски мои не прекращались ни на секунду и пришлось даже поднять знания по английскому. Поднимались они с трудом, но зато много проще, чем лет пять тому назад =)

Вот что я нашёл =) Вроде всё написано правильно, разве только студия ругается на туеву хучу ошибок. Может кто поможет?..

UPD:
Здесь C#.

Добавлено через 3 минуты
Ну хотя бы какой-нить линк на хотя бы забугорную документацию должен же быть?.. Просто понимаете, я до этого не сталкивался с DirectX'ом и его причендалами, поэтому половина Ваших слов было прочитано одним глазом, а другой глаз очень сильно помог мне всё это забыть (бррр... ед).

Ах да - среда реализации - было бы не плохо C++, ибо его я практикую сейчас, но сойдёт и C#. Visual Studio 2008.
0
AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
Завершенные тесты: 1
10.09.2011, 21:34  [ТС] 4
Собственно, WTF!!!!!!!!!!!!!!!!????

В аттаче - моя беда.

В кратце - какого фига не поставился нормально DirectX SDK?..
0
Миниатюры
Самый простой вопрос на сегодня.  
AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
Завершенные тесты: 1
10.09.2011, 21:48  [ТС] 5
Впрочем, всё решилось достаточно просто =)

Не знаю зачем, но разрабы уже надоели своей... Не знаю чем, но надоели. Одну маленькую кнопочку запихнуть в невзрачное (и совершенно не интуитивное) контекстное меню какой-то папочки =(

В аттаче будет по скринное решение =)

Спасибо за то, что рядом, поехал дальше реализовывать свою задачу! Вперёд, во славу коммунизма!
0
Миниатюры
Самый простой вопрос на сегодня.   Самый простой вопрос на сегодня.  
10.09.2011, 21:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2011, 21:48

Самый большой простой делитель числа
#include &lt;iostream&gt; using namespace std; void main() {...

Самый простой, примитивный морской бой
Достаточно много исходников уже искал но так и не нашел что нужно нужно как...

Самый тупой вопрос)))
В какой программе можно создавать программы, написанные на языке С++?


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

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

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