Russian Qt Forum

Qt => Мультимедиа => Тема начата: sibmail от Май 25, 2012, 07:00



Название: QAudioInput. Непонятки.
Отправлено: sibmail от Май 25, 2012, 07:00
На винде. Пишу в коде setSampleType(QAudioFormat::UnSignedInt) записываю pcm. Открываю pcm в SoundForge и оказывается она записана SignedInt.
В линуксе если указываю QAudioFormat::UnSignedInt то оно так и будет.
Проблема возникла при передачи звука с линукса на винду. на винде звук тарахтел.

что за фигня такая?


Название: Re: QAudioInput. Непонятки.
Отправлено: sibmail от Май 25, 2012, 07:28
причем проблема наблюдается если setSampleSize(16)
QAudioFormat format;
format.setFrequency(8000);
format.setChannels(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");


Название: Re: QAudioInput. Непонятки.
Отправлено: LisandreL от Май 25, 2012, 10:24
Открываю pcm в SoundForge и оказывается она записана SignedInt.
А заголовок составляете сами? Или без него?
Просто заголовок-то QAudioInput не формирует, только raw данные.
А по raw данным формат SF может только угадывать. Если не совпало только SampleType, то это просто чудо.


Название: Re: QAudioInput. Непонятки.
Отправлено: sibmail от Май 26, 2012, 05:38
никаких заголовков. чистый pcm.


Название: Re: QAudioInput. Непонятки.
Отправлено: LisandreL от Май 26, 2012, 12:35
Ну а тогда SoundForge-у просто неоткуда узнать, что это за формат.
Это уже вы должны ему сказать при открытии или после (где не подскажу - программой не пользуюсь).


Название: Re: QAudioInput. Непонятки.
Отправлено: xokc от Май 27, 2012, 01:08
С трудом себе представляю 16 битный unsigned звук в Windows. С ещё бОльшим трудом представляю такое с QAudioInput и Windows. Если так уж нужно писать именно 16 битный unsigned, нужно воспользоваться сторонними библиотеками, ну или, просто добавить по 32767 к значению каждого из отсчётов после получения их от звуковой платы.


Название: Re: QAudioInput. Непонятки.
Отправлено: sibmail от Май 27, 2012, 22:30
С трудом себе представляю 16 битный unsigned звук в Windows. С ещё бОльшим трудом представляю такое с QAudioInput и Windows. Если так уж нужно писать именно 16 битный unsigned, нужно воспользоваться сторонними библиотеками, ну или, просто добавить по 32767 к значению каждого из отсчётов после получения их от звуковой платы.

так в чем фишка? расскажите


Название: Re: QAudioInput. Непонятки.
Отправлено: xokc от Май 29, 2012, 20:37
так в чем фишка? расскажите
Я ж вроде всё рассказал. Для звуковой подсистемы Windows, с которой работает QAudioInput (mmsystem), "navtive" 16 битным форматом является знаковый целый. Если нужен другой формат - работайте с Windows звуком через другие API (DirectX, ASIO, WDMKS, WASAPI), но не факт, что драйвер Вашей звуковой платы будет эти API корректно поддерживать. Либо используйте более "продвинутые" и высокоуровневые чем QAudioInput audio движки (portaudio, RtAudio и т.п. - они прекрасно работают совместно с Qt). Самый простой для Вас выход - после получения данных от звуковой платы в signed формате к каждому отсчёту добавить 32767 - получите unsigned. Самый "правильный" - получение данных в наиболее "естественном" для текущей комбинации ОС + звуковая плата + драйвер формате (обычно для современных плат это 32 битный нормализованный float + 192 (96) кГц) и самостоятельный ресемплинг в 8 кГц плюс самостоятельное же преобразование в 16 бит unsigned. Но, не зная того, что Вы делаете с этим звуком дальше, ничего более рассказать не могу. Если ещё что-то непонятно - спрашивайте конкретнее.


Название: Re: QAudioInput. Непонятки.
Отправлено: sibmail от Май 30, 2012, 08:45
понятно. спасибо. ну в книжках же не пишут что для винды 16 бит только signed.
задача стоит в пересылке звука на другие компы (устройства). устройства понимают только 8000 16 моно uLaw.
а ресемплинг сделать делать сложно? где вообще можно почитать как преобразовать например wav в pcm. а то сейчас наткнулся на эту проблему.


Название: Re: QAudioInput. Непонятки.
Отправлено: xokc от Май 30, 2012, 15:39
Если коротко, то качественный ресемплинг делать сложно. Но нужен ли Вам качественный? Если оконечные устройства звук просто воспроизводят - то не нужен, если нужна какая-то цифровая обработка сигналов (демодуляция и т.п.), то - нужен. В интернете полно готовых библиотек ресемплеров, они легко находятся гуглом. Я пользовался libsamplerate - отличная штука, но там GPL. Если это не критично - рекомендую. По поводу WAV и PCM вроде в соседней теме уже ответили.