【问题标题】:Android library to stream local stored audio via RTPAndroid 库通过 RTP 流式传输本地存储的音频
【发布时间】:2013-07-23 02:40:14
【问题描述】:

是否可以通过 RTP 传输本地存储的音频文件(例如 mp3)?例如。有一个 mp3 文件作为输入并转换/打包成 RTP 数据包并通过网络发送。 是否有任何库、解决方案、示例?

谢谢!

//编辑:我要做的是用SIP拨打电话并将本地存储的音频文件发送/流式传输给被叫方,以便他可以听到。

【问题讨论】:

    标签: java android audio streaming rtp


    【解决方案1】:

    在第 5 节中检查可能的 WebRTC solutions.... 尚未使用它,但听起来像是为您尝试做的事情量身定制的。也许使用Ondello api。

    您必须为 SIP/RTP 连接构建会话,为接收麦克风原始流的缓冲区或麦克风原始流编码到的输出缓冲区提供后门(JNI 和本机代码)...这样做,您可以在发送方使用预录音频加载 RTP 流。

    通过访问该缓冲区,在 SIP 会话中间,您可以从内存中的音频文件版本进行 Xcopy,将该流交换到 SIP 呼叫中。通话另一端的一方将听到音频文件中的音频,而不是麦克风内容。

    如果使用 SIP/RTP api 不成功,您还可以检查这个非常好的 java 网络库,它允许您从头开始构建 SIP 连接并以您想要的任何方式交换缓冲区。

    https://github.com/brunodecarvalho/efflux

    thread查看我的回答

    选项 2,客户端服务器(此处不需要 JNI 本机代码)

    从发送方上传音频,并将其从您的服务器作为 RTSP 提供给接收方。任何 Youtube 视频曾经(仍然可能)为 RTSP 客户端编码,并且是众所周知的服务器到安卓媒体播放器场景。我相信这是这样一个文件的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
    

    【讨论】:

    • 感谢您的回答。听起来很有趣。我会检查你的链接。你做过类似的事情吗?我已经与 MjSip 建立了通话。如何获取此麦克风缓冲区?您是否使用过 efflux API 并给我一些提示/示例如何使用它?
    • 在 'efflux' 上,试试 test 文件夹的例子。
    • 我已经看到了,但是没有文档或任何 cmets。所以我真的不知道如何使用这些样本
    • 仪器测试..调试它们..学习它们..自己编写。
    【解决方案2】:

    您可以在 Android API 中使用android.net.rtp

    【讨论】:

    • 感谢您的回答。但是,Android API 不只是从麦克风获取输入吗?如何流式传输本地文件?
    • 有关硬件和 api 如何交互的示例,请参阅 'audiotrack' 中的 'write' 语句...developer.android.com/reference/android/media/AudioTrack.html
    • 当 PBX 在 SIP 电话系统上向您播放消息时,也是同样的事情。它从作为味精的文件中流式传输。因此,您必须以某种方式获取文件,将其映射到内存,然后使用符合协商 RTP 的编码将该编码流提供给 RTP 连接。
    • 您可以下载 openser 或 kamalio 并查看语音消息如何通过 VOIP 堆栈中的 SIP 连接播放。这将是很多工作,但模块在那里。
    • 如果我是你,我会追求 webRTC。
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多