Russian Qt Forum

Qt => Мультимедиа => Тема начата: carrygun от Август 31, 2014, 14:38



Название: Симуляция микрофона
Отправлено: carrygun от Август 31, 2014, 14:38
Всем привет.

Сразу скажу что название, возможно, неподходящее.

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

Я почитал документацию по multimedia и думал что все будет хорошо с QAudioOutput. Сначала я подсмотрел пример и решил действовать в лоб: проиграть семпл на стандартном входе (микрофон), но я слышал этот звук в колонках, никак записать его не удалось. Потом решил писать в поток, но вышло примерно то же самое.
Вот пример:
Код
C++ (Qt)
...
   m_sourceFile.setFileName("test2.wav");
   if (!m_sourceFile.open(QIODevice::ReadOnly)) {
       qDebug() << "Failed to open file!";
       return;
   }
 
   QByteArray sound = m_sourceFile.readAll();
 
   QAudioFormat format = makeFormat();
   m_audioOutput = new QAudioOutput(m_defaultInputDevice, format, this);
   m_output = m_audioOutput->start();
   m_output->write(sound);
...
 

Писать в поток входа не получилось, он доступен только для чтения.
Люди добрые, поделитесь советом, или ссылок накидайте в этом направлении.


Название: Re: Симуляция микрофона
Отправлено: Bepec от Август 31, 2014, 15:27
Цитировать
проиграть семпл на стандартном входе (микрофон), но я слышал этот звук в колонках, никак записать его не удалось.
Это как? :)

А по делу - ищите опен сорс проекты по передаче звука аля ventrilo, только умеющими ещё и звук транслировать :)


Название: Re: Симуляция микрофона
Отправлено: carrygun от Август 31, 2014, 15:37
Отдельно эти вещи сделать не трудно, а вот скомбинировать как раз не могу.


Название: Re: Симуляция микрофона
Отправлено: Bepec от Август 31, 2014, 16:18
Если нетрудно, выкиньте код как делать по отдельности :) Желательно работающий. И я, а то и десятки людей скажут вам спасибо :D


Название: Re: Симуляция микрофона
Отправлено: carrygun от Август 31, 2014, 16:56
Как снять звук с микрофона и как вывести в колонки есть в справке по QAudioInput и QAudioOutput соответственно. Вот здесь (http://www.codeproject.com/Articles/421287/Cross-Platform-Microphone-Audio-Processing-Utility), например, вывод звука с микрофона на колонки с преобразованием.
Я просто не пойму можно ли средствами Qt подать звук на микрофон программно? Или надо копать вообще в сторону микшера и снимать с выхода а не входа? В общем я в этом не силен, поэтому и совета у вас прошу.


Название: Re: Симуляция микрофона
Отправлено: Bepec от Август 31, 2014, 17:24
Разобьём на части.
Для снятия звука с микрофона класс есть? есть.
А есть ли класс для "впихивания" в него? нет.

Следовательно ничего готового нет. Если и есть, то хитрые обходы и недокументированные возможности, но вряд ли :)

 А т.к. работа с микрофоном не кроссплатформенна без Qt, то нужно копать в сторону Api ОС.


Название: Re: Симуляция микрофона
Отправлено: navrocky от Август 31, 2014, 22:07
Зависит от звуковой карты. Она или может записывать с проигрывающего тракта или не может. Конкретно с микрофонного входа, в любом случае, ты воспроизводимый звук не получишь.

Запись воспроизводимого звука как правило управляется в микшере звуковухи. К примеру под Linux, при использовании alsamixer на некоторых звуковухах можно включить эту возможность. Под виндой я хз.

ЗЫЖ Самое надежное решение - с твоей прогой прикладывать проводок, который будет соединять выход наушников с микрофоном :D


Название: Re: Симуляция микрофона
Отправлено: xokc от Сентябрь 02, 2014, 08:17
Поддержу предыдущего оратора. Добавлю, что эта возможность скорее зависит от конкретного набора драйверов, используемого API и даже версии ОС. Универсального решения типа "воткнул и работает" не получится. Хотя вариант-то такой есть - называется Virtual Audio Cable (http://software.muzychenko.net/eng/vac.htm), правда только под Windows и за деньги. Там можно соединить выходы и входы звуковых плат и программ "виртуальным кабелем", что и позволит решить твою задачу.