2010-11-14 3 views
4

У меня есть вопросы по дизайну, которые я хочу обсудить с людьми, заинтересованными в оказании мне помощи. Я планирую разработать простую VoIP-программу, которая позволяет двум телефонам Android в той же сети использовать VoIP. Моя цель - просто записать звук, отправить данные с помощью UDP, получить данные UDP и воспроизвести звук.Android: Реализация VoIP-программы

Мой текущий дизайн должен иметь 2 потока: один захватывает микрофон и отправляет данные; другой получает байты и воспроизводит их.

Я начал реализовывать это с помощью MediaPlayer и MediaRecorder. Проблема, которая возникла, заключается в том, как записывать и воспроизводить звук? Таким образом, я хотел бы знать, нужно ли мне использовать файл, хотя это кажется медленным, или если все равно, чтобы запись была автоматически отправлена ​​на мой UDP-сокет, пожалуйста?

В принципе, мне интересно, нужно ли записывать в файл, а затем играть в него или просто пропустить сокет (для записи и воспроизведения).

У кого-нибудь есть предложения, пожалуйста?

Большое спасибо

+0

Что вы подразумеваете под «телефонами в одной сети», это не все эти устройства в Интернете? –

+2

В той же сети я подразумеваю, что он не выходит из поля NAT (например, это маршрутизатор Linksys). Проблема будет в брандмауэре: входящее соединение будет отклонено, поскольку оно не знает, какое устройство пересылает его, а также по соображениям безопасности. По этой причине все устройства будут подключены к одному маршрутизатору для моего первого шага, и я буду вручную вводить IP-адреса. – Jary

ответ

1

MediaRecorder нужен FD так, вы можете использовать сокеты, а также. Я не вижу никаких проблем с этим. Все зависит от того, как вы будете проектировать свою систему.

+0

Когда я использую класс «Socket», я могу передать сокет в MediaRecorder, но класс Socket использует TCP, похоже. Я пытаюсь использовать классы DatagramSocket и DatagramPacket, поскольку он использует UDP, но MediaRecorder не будет принимать эти классы. Я использовал ParcelFileDescriptor.fromSocket(), но для этого требуется Socket, а не DatagramSocket. Любые идеи, пожалуйста? – Jary

1

Не используйте эти классы для потоковой передачи аудио - вместо этого используйте AudioTrack и AudioRecord.

Они обеспечивают функциональность, необходимую для воспроизведения и записи необработанных аудиоданных, без обращения к FD.

При записи кадра (байта [] или короткого []) заверните его в UDP-пакет. Когда вы получаете UDP-пакет, распакуйте соответствующий байт [] или короткий [] и воспроизведите его.

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