2013-07-23 2 views
1

Возможно ли передавать локальный сохраненный звуковой файл (например, mp3) через RTP? Например. есть mp3-файл, который берется как входной и преобразованный/упакованный в RTP-пакеты и отправляемый по сети. Есть ли библиотеки, решения, примеры?Android-библиотека для потоковой передачи локального сохраненного аудио через RTP

Спасибо!

// Edit: то, что я хочу сделать, это сделать телефонный звонок с SIP и отправить/передать локальный сохраненный звуковой файл вызываемому, чтобы он мог его услышать.

ответ

1

проверить на возможное WebRTC solutions в разделе 5 .... Не работал с ним, но звучит как его портной, сделанный для того, что вы пытаетесь сделать. Возможно использовать Ondello api.

ИЛИ

Вы должны построить сеанс для связи SIP/RTP, обеспечивая бэкдор (JNI и машинный код) в буфер, который принимает необработанный поток микрофона или выходной буфер, где микрофон сырья поток закодирован ... Посредством этого вы можете загружать поток RTP со стороны отправителя с помощью аудиосигнала предварительной записи.

С помощью этого буфера, находящегося в середине сеанса SIP, вы можете использовать Xcopy из версии вашего аудиофайла в памяти, заменяя этот поток на вызов SIP. Сторона на другом конце вызова услышит звук из аудиофайла, а не содержание микрофона.

Если вы не успели с помощью SIP/RTP apis, вы также можете проверить эту очень хорошую сетевую библиотеку java, которая позволяет вам строить SIP-соединения с нуля и свопировать буферы любым способом, который вы хотите.

https://github.com/brunodecarvalho/efflux

см мой ответ на этом thread

ВАРИАНТА 2, клиент-сервере (не JNI родного кода треб здесь)

Загрузить аудио от отправителя и обслуживать его с вашего сервера как RTSP к приемнику. Любое видео Youtube, которое раньше (по-прежнему может быть) закодировано для клиентов RTSP, является довольно известным сценарием от сервера к Android-медиа-плееру. Я считаю, что это описание SDP такого файла и журнал сеанса ...

D/chooseit(6854): Session Descriptor 
D/chooseit(6854): v=0 
D/chooseit(6854): o=GoogleStreamer 1263099257 1890734730 IN IP4 74.125.213.247 
D/chooseit(6854): s=Video 
D/chooseit(6854): c=IN IP4 0.0.0.0 
D/chooseit(6854): b=AS:51 
D/chooseit(6854): t=0 0 
D/chooseit(6854): a=control:* 
D/chooseit(6854): a=range:npt=0-63.800000 
D/chooseit(6854): m=video 0 RTP/AVP 98 
D/chooseit(6854): b=AS:39 
D/chooseit(6854): a=rtpmap:98 H263-2000/90000 
D/chooseit(6854): a=control:trackID=0 
D/chooseit(6854): a=cliprect:0,0,144,176 
D/chooseit(6854): a=framesize:98 176-144 
D/chooseit(6854): a=fmtp:98 profile=0;level=10 
D/chooseit(6854): m=audio 0 RTP/AVP 99 
D/chooseit(6854): b=AS:12 
D/chooseit(6854): a=rtpmap:99 AMR/8000/1 
D/chooseit(6854): a=control:trackID=1 
D/chooseit(6854): a=fmtp:99 octet-align 
D/chooseit(6854): Got response: 
D/chooseit(6854): RTSP/1.0 200 OK 
D/chooseit(6854): Content-Type: application/sdp 
D/chooseit(6854): Cache-Control: must-revalidate 
D/chooseit(6854): Date: Wed, 28 Sep 2011 17:27:22 GMT 
D/chooseit(6854): Expires: Wed, 28 Sep 2011 17:27:22 GMT 
D/chooseit(6854): Last-Modified: Wed, 28 Sep 2011 17:27:22 GMT 
D/chooseit(6854): Content-Base: rtsp://v8.cache8.c.youtube.com/CigLENy73wIaHwlcw_gs85OUchMYDSANFEgGUgx1c2VyX3VwbG9hZHMM/0/0/0/video.3gp/ 
D/chooseit(6854): CSeq: 0 
D/chooseit(6854): Server: Google RTSP 1.0 
D/chooseit(6854): Content-Length: 406 
D/chooseit(6854): 
D/chooseit(6854): for the request: 
D/chooseit(6854): DESCRIBE rtsp://v8.cache8.c.youtube.com/CigLENy73wIaHwlcw_gs85OUchMYDSANFEgGUgx1c2VyX3VwbG9hZHMM/0/0/0/video.3gp RTSP/1.0 
D/chooseit(6854): CSeq: 0 
D/chooseit(6854): Accept: application/sdp 
D/chooseit(6854): User-Agent: RTSPClientLib/Java 
D/chooseit(6854): 
D/chooseit(6854): Got response: 
D/chooseit(6854): RTSP/1.0 200 OK 
D/chooseit(6854): Session: 328393bf;timeout=90 
D/chooseit(6854): Transport: RTP/AVP;unicast;mode=play;client_port=49060-49061;server_port=10580-10581;source=74.125.213.247;ssrc=55922C32 
D/chooseit(6854): Cache-Control: must-revalidate 
D/chooseit(6854): Date: Wed, 28 Sep 2011 17:27:22 GMT 
D/chooseit(6854): Expires: Wed, 28 Sep 2011 17:27:22 GMT 
D/chooseit(6854): Last-Modified: Wed, 28 Sep 2011 17:27:22 GMT 
D/chooseit(6854): CSeq: 1 
D/chooseit(6854): Server: Google RTSP 1.0 
D/chooseit(6854): 
D/chooseit(6854): for the request: 
D/chooseit(6854): SETUP rtsp://v8.cache8.c.youtube.com/CigLENy73wIaHwlcw_gs85OUchMYDSANFEgGUgx1c2VyX3VwbG9hZHMM/0/0/0/video.3gp/trackID=1 RTSP/1.0 
D/chooseit(6854): CSeq: 1 
D/chooseit(6854): Transport: RTP/AVP;unicast;client_port=49060-49061 
D/chooseit(6854): User-Agent: RTSPClientLib/Java 
D/chooseit(6854): 
D/chooseit(6854): using client IP addr 192.168.1.125 
D/chooseit(6854): remote ssrc 1435642930 
D/chooseit(6854): raw parms 49060 10580 74.125.213.247 
D/chooseit(6854): session: 328393bf 
D/chooseit(6854): transport: client_port=49060-49061 server_port=10580-10581 source=74.125.213.247 ssrc=55922C32 
D/chooseit(6854): Got response: 
D/chooseit(6854): RTSP/1.0 200 OK 
D/chooseit(6854): Session: 328393bf;timeout=90 
D/chooseit(6854): Range: npt=0.000-63.800 
D/chooseit(6854): RTP-Info: url=rtsp://v8.cache8.c.youtube.com/CigLENy73wIaHwlcw_gs85OUchMYDSANFEgGUgx1c2VyX3VwbG9hZHMM/0/0/0/video.3gp/trackID=1;seq=9498;rtpt 
ime=958652148 
D/chooseit(6854): CSeq: 2 
D/chooseit(6854): Server: Google RTSP 1.0 
D/chooseit(6854): 
D/chooseit(6854): for the request: 
D/chooseit(6854): PLAY rtsp://v8.cache8.c.youtube.com/CigLENy73wIaHwlcw_gs85OUchMYDSANFEgGUgx1c2VyX3VwbG9hZHMM/0/0/0/video.3gp RTSP/1.0 
D/chooseit(6854): CSeq: 2 
D/chooseit(6854): Session: 328393bf;timeout=90 
D/chooseit(6854): Range: npt=0.000- 
D/chooseit(6854): User-Agent: RTSPClientLib/Java 
+0

Спасибо за ваш ответ. Звучит interresing. Я проверю ваши ссылки. Вы сделали что-то подобное? Я установил звонок с MjSip. Как получить этот буфер микрофона?Вы работали с API efflux и дали мне подсказку/пример того, как ее использовать? – B770

+1

на «efflux», попробуйте тестовую папку для примера. –

+0

Я видел это, но нет комментариев или комментариев. Так что я действительно не знаю, как использовать эти образцы – B770

2

Вы можете использовать android.net.rtp в Android API.

+0

Thx для вашего ответа. Но разве Android API не использует только вход от микрофона? Как я могу передать локальный файл? – B770

+1

для примера того, как аппаратные средства и api взаимодействуют, см. Инструкции 'write' в 'audiotrack' ... http://developer.android.com/reference/android/media/AudioTrack.html –

+1

, когда УАТС воспроизводит сообщение обратно к вам в SIP-телефоне, это то же самое. его потоковая передача из файла, который является msg. Таким образом, вам нужно как-то добраться до файла, отобразить его в память, а затем передать этот закодированный поток в RTP-соединение, используя кодировку, которая будет соответствовать согласованному RTP. –