2010-02-13 4 views
32

Я пытаюсь понять, как написать приложение, которое может декодировать аудио-код Морзе на лету. Я нашел this document, в котором объясняется, как записывать аудио с микрофона в Android. Я хотел бы знать, можно ли получить доступ к исходному входу с микрофона или нужно ли его записать/прочитать в файл.Обработка звука в реальном времени в Android

Спасибо.

+0

Вы когда-нибудь делали этот проект Пол? Я смотрю что-то похожее на проект «Гомер» и интересовался также обработкой входящего звука «на лету» ... возможно, нужно использовать собственную библиотеку, чтобы получить достаточную производительность? напишите мне по электронной почте, если вы хотите по andrew на mackenzie-serres.net. Благодаря! –

ответ

22

Если вы используете MediaRecorder (пример, выше), он будет сохранять сжатый звук в файл.

Если вы используете AudioRecord, вы можете получить образцы аудио напрямую.

Да, то, что вы хотите сделать, должно быть возможным.

-2

Похоже, что его сначала нужно сбрасывать в файл.

Если вы заглядываете в android.media.AudioRecord source, , то буферы собственных байтов аудиоданных не подвергаются публичному API.

По моему опыту, создав аудио синтезатор для Android, трудно добиться производительности в реальном времени и поддерживать точность воспроизведения аудио. «Переводчик» Морзе-кода, безусловно, выполним, и звучит как забавный маленький проект. Удачи!

+0

Почему вы считаете, что звуковые буферы не передаются на Java? Как насчет метода read()? – dmazzoni

+0

-1 Вам определенно не нужно сначала выгружать файл. –

6

Использование AudioRecord является излишним. Просто проверьте MediaRecorder.getMaxAmplitude() каждые 1000 миллисекунд за громкие шумы против молчания.

Если вам действительно нужно проанализировать форму волны, тогда да вам потребуется AudioRecord. Получите необработанные данные и вычислите что-то вроде среднего квадрата корня части необработанных байтов, с которыми вы связаны, чтобы получить представление об объеме.

Но почему все это при использовании MediaRecorder.getMaxAmplitude() гораздо проще в использовании.

видеть мой код из этого ответа: this question

+0

1000 мс = 1 с, что кажется почти не достаточно для анализа кода Морзе. – StockB

+2

Но вы не можете использовать getMaxAmplitude() (ну, вы можете, но вы всегда получите 0), если только вы не начнете запись. Поэтому вам все равно придется записывать файл, который может расти бесконечно большим. Определенно не решение. – matteo

5

есть рамки считывания из MIT медиа лабораторий под названием Funf: http://code.google.com/p/funf-open-sensing-framework/
Они уже созданы классы для аудио входа и некоторого анализа (FFT и т.п.), а также сохранение до файлов или загрузки реализовано, насколько я видел, и они обрабатывают большинство датчиков, доступных на телефоне. Вы также можете получить вдохновение от кода, который они написали, что я считаю довольно хорошим.

Смежные вопросы