Название: Заикание звука - Qt + RtAudio Отправлено: Jey от Январь 24, 2011, 02:49 Добрый день :)
Работаю над программой, которая должна стримить аудио и воспроизводить его. Включил в свой msvs-qt-проект для этой цели oggz, libfishsound и RtAudio. Пишу сейчас непосредственно проигрыватель. Суть проблемы в том, что при воспроизведении звук страшно "заикается". libfishsound декодирует для меня ogg-файл, предоставляя pcm-данные. Для проверки корректности этих данных я сливал их в wav-файл с помощью либы libsndfile - в винампе этот файл воспроизводился корректно (однако, с какими-то негромкими пощелкиваниями на басах). Помимо RtAudio я успел использовать portaudio - получил то же самое. Причем пробовал метод и с callback'ом и с блокирующей записью. Во всех случаях пробовал играть с различными программными настройками для этих либ. А до всего этого также пробовал QAudioOutput, но кроме шипения ничего не получил :) Я собрал минималистичный проект, в котором считываются pcm-данные из файлика. Данные я слил в файлик с помощью основного проекта. Как результат - при его воспроизведении тоже получилось заикание. RtAudio в данной конфигурации использует direct sound. PCM-данные имеют тип float interleaved. Если кто-нибудь подозревает в чем проблема, подскажите, пожалуйста :) Я с этим уже довольно долго не разберусь никак. Может быть, я неправильно использую выходящий от декодера float** в моем проекте? Я нагло интерпретирую его как void* и скармливаю RtAudio. Ни при каких других испробованных мною вариаций ничего хорошего не воспроизводилось вообще :) Скомпилированный проект (для прверки) можно скачать тут (http://jbs.3dn.ru/sharefiles/compilated.zip). Исходники (msvs10) - здесь (http://jbs.3dn.ru/sharefiles/msvs10_sln.zip). Файл с обрезком pcm в них приложил. Код: #include <QtCore/QCoreApplication> Название: Re: Заикание звука - Qt + RtAudio Отправлено: pastor от Январь 24, 2011, 15:51 А попробуй так:
Код
Название: Re: Заикание звука - Qt + RtAudio Отправлено: Jey от Январь 24, 2011, 17:39 Спасибо за ответ :) Попробовал с таким сеттингом. Вот что получилось (http://jbs.3dn.ru/sharefiles/compilated_2.zip).
Заикания при этом нет :) На этом хорошее кончается и начинается: играет только одна колонка, а звук такой, будто группа орков дает концерт :D (А в дополнение к этому я услышал те же пощелкивания на басах, как тогда, когда я полученные декодированные данные слил в wav-файл с помощью libsndfile и воспроизвел его в винампе). В этот раз, как я понял, мы указываем RtAudio рассматривать данные как non-interleaved. Но они должны быть все же interleaved, потому что в декодере я вызывал функцию fish_sound_set_decoded_float_ilv(). Попробовал вместо этого вызвать fish_sound_set_decoded_float(), чтобы в дальнейшем получить non-interleaved данные и воспроизвести их в этом же примере - получился просто шум :-\ Еще при буфере размером 512 постоянно срабатывало qDebug() << "Stream overflow detected!"; Я немного увеличил его, чтобы этого не происходило. Но на звук это ощутимо не повлияло :) Название: Re: Заикание звука - Qt + RtAudio Отправлено: pastor от Январь 24, 2011, 18:57 А если попробовать выввод через ASIO драйвер?
http://www.asio4all.com/ Название: Re: Заикание звука - Qt + RtAudio Отправлено: Akon от Январь 25, 2011, 22:40 У меня QAudioOutput/QAudioInput работают без проблем на целочисленной PCM 8 и 16 бит. Единственное, в них не очень продуманная реализация, т.к. callback'и данных проходят через очередь сообщений потока (используются асинхронные сигналы), в котором живут QAudioOutput/QAudioInput, т.е. при прямом использовании из основного потока возможны задержки.
Попробуй сам преобразовать формат в PCM 8 или 16 и воспроизвести. |