Я хочу записать свой микрофон и обработать в режиме реального времени, например. покажите осциллограмму сигнала микрофона.
Я пробовал 3 способа получить данные из PulseAudio, и все они работают одинаково. Я ожидаю гладкого потока двоичных файлов, но вместо этого есть шаблон примерно такой: зависание ~ 300 мс, печать тонны вывода, повтор.
3 разных способа, 2 разных машины, одинаковые результаты.
Первый способ был parec
.
2-й и 3-й способ — привет миры на C и Haskell, оба используют библиотеку pulse-simple
.
C: https://freedesktop.org/software/pulseaudio/doxygen/parec-simple_8c-example.html#a7
Хаскелл:
import Sound.Pulse.Simple
import Control.Monad
import System.IO
main = do
s <- simpleNew Nothing "example" Record Nothing
"this is an example application"
(SampleSpec (F32 LittleEndian) 44100 1) Nothing Nothing
forever $ do
let numSamples = 4410
xs <- simpleRead s $ numSamples :: IO [Float]
putStrLn $ "hello"
hFlush stdout
Сброс стандартного вывода в теле цикла не имеет значения.
Добавление задержки в цикле меняет производительность, но не так, как мне нужно.
Каким-то образом pavucontrol
волюметр делает это правильно. Что мне не хватает?
РЕДАКТИРОВАТЬ: я обнаружил, что во время работы pavucontrol
я получаю отличные результаты как в моих примерах программ, так и с parec
. Почему??
Кроме того, я посмотрел на источник pavucontrol
и parec
, и оказалось, что они оба используют asynchronous
API, а мои 2 примера программ используют simple
API. Таким образом, проблема не полностью связана с использованием 1 API или другого, поскольку parec
ведет себя как программы-примеры.