LINUX.ORG.RU

Микрофон в Android как читать его с нескольких потоков

 


0

1

https://developer.android.com/reference/android/media/AudioRecord

Хочу немного, читать микрофон AudioRecord.read и визуализировать его в виде Wave. Один поток читает и записывает в сеть или на диск другой...тоже его читает и... приложение вылетает. Не понятно из-за чего, каких внятных ошибок нет в логах, какие андроивские потроха сыпятся на уровне ядра.

Там сам вызов блокирующий, но есть параметр readMode=READ_BLOCKING, READ_NON_BLOCKING. Один тред читает с блокировкой - другой - пробовал и так и сяк, все равно вылетает. Если читает один только тред, то работает нормально

В общем нормально ли я вообще затеял это все или нужно один читальщик? Но дело в том, что буферы разные, для визуализации нужно побольше прочитать, а для записи там буфер мелкий совсем.


Один тред создается через new Thread, а второй - это тред UI. Но я пробовал в треде UI создавать новый тред, но все равно что-то не идет.

Вообще конечно по логике если разобраться, то так нельзя. Звук же будет прерываться, если например кусочек прочитаешь, то в файле уже этого кусочка не будет, будет пердеть, заикаться. Хотя нет. Многие приложения ведь используют один микрофон. Или нет?

Не знаю как быть, подскажите вообще не понимаю

★★★★

Последнее исправление: gobot (всего исправлений: 3)
Ответ на: комментарий от man-from-36

Так ты хочешь из двух потоков читать?

Да

Читай в свой буфер, а дальше уже разбирай его как хочешь

Я и так делал тоже, но для визуализации нужно прочитать в short[] буфер, а другой поток читает в byte[]

gobot ★★★★
() автор топика

можно вбахать Gstreamer и мультиплексор на несколько sink. (один в сеть, второй в диск, третий в визуализатор) https://gstreamer.freedesktop.org/documentation/tutorials/android/?gi-language=c ; заодно можно и всяких звуковых эффектов добавить

делается довольно на автомате: на баше строишь конвеер gstreamer, «читать микрофон, писать на диск + слать в сеть + в шареную память» потом c методичкой переводишь это на C/C++

для звука может и полегче/поспецифичней есть либы, аудифилы должны знать :-) но смысл такой что бери более высокого уровня библиотеки и не ипись с READ_BLOCKING

MKuznetsov ★★★★★
()