如何修改仅使用 Kurento 录制音频的答案 SDP?

Posted

技术标签:

【中文标题】如何修改仅使用 Kurento 录制音频的答案 SDP?【英文标题】:How to modify answer SDP for record audio only with Kurento? 【发布时间】:2015-10-04 23:00:00 【问题描述】:

我可以使用 Kurento 媒体服务器录制视频+音频。我在录制纯音频流时遇到问题。从How to use kurento-media-server for audio only stream? 了解到必须修改答案 SDP。

目前我正在向 PeerConnection 添加只有音轨的 MediaStream。在服务器端发回答案 SDP 之前,我对其进行了修改。我尝试删除

    以下任何内容(包括)m=video 以下任何内容(包括)a=mid:video

在这两种情况下,浏览器端 PeerConnection#signalingState 都停留在 have-local-offer

在媒体流将开始流动并且 Kurento 将开始录制纯音频流的答案 SDP 中有何更改?

这是来自 WebRtcEndpoint#processoffer 的原始答案 SDP(删除的来源):

v=0
o=- 7750769884654864002 0 IN IP4 0.0.0.0
s=Kurento Media Server
c=IN IP4 0.0.0.0
t=0 0
a=group:BUNDLE audio video
m=audio 40192 RTP/SAVPF 111 0
c=IN IP4 10.0.2.15
a=rtpmap:111 opus/48000/2
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:40192 IN IP4 10.0.2.15
a=rtcp-mux
a=s-s-rc:4125152746 cname:user2534372120@host-b735c5b0
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=mid:audio
a=ice-ufrag:SEV7
a=ice-pwd:BQyTSM0hvTJeqykFZovuBS
a=fingerprint:sha-256 E4:A1:25:2C:53:60:28:F5:C1:94:C6:32:E0:13:81:06:A6:66:77:00:52:C2:D9:93:AF:E4:A0:B3:4D:5C:9C:C3
a=candidate:1 1 UDP 2013266431 10.0.2.15 40192 typ host
a=candidate:2 1 UDP 2013266431 192.168.33.10 44816 typ host
m=video 40192 RTP/SAVPF 100
c=IN IP4 10.0.2.15
b=AS:500
a=rtpmap:100 VP8/90000
a=sendonly
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtcp-fb:100 goog-remb
a=rtcp:40192 IN IP4 10.0.2.15
a=rtcp-mux
a=s-s-rc:1769273725 cname:user2534372120@host-b735c5b0
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=mid:video
a=ice-ufrag:SEV7
a=ice-pwd:BQyTSM0hvTJeqykFZovuBS
a=fingerprint:sha-256 E4:A1:25:2C:53:60:28:F5:C1:94:C6:32:E0:13:81:06:A6:66:77:00:52:C2:D9:93:AF:E4:A0:B3:4D:5C:9C:C3
a=candidate:1 1 UDP 2013266431 10.0.2.15 40192 typ host
a=candidate:2 1 UDP 2013266431 192.168.33.10 44816 typ host

编辑:

根据 kurento google 小组的建议,似乎没有必要修改 SDP。至少使用 Kurento 6。 我得到了纯音频工作(来自浏览器的纯音频媒体流和来自浏览器的音频+视频媒体流)。为此(Ruby 中的示例代码):

    在 RecorderEndpoint builderRecorderEndpoint::Builder.new(@pipeline, location).withMediaProfile(org.kurento.client.MediaProfileSpecType::WEBM_AUDIO_ONLY).build() 中指定 MediaProfileSpecType 连接记录器端点时指定MediaType(@source 是WebRtcEndpoint): @source.connect(@recorder, org.kurento.client.MediaType::AUDIO)

【问题讨论】:

【参考方案1】:

您必须在这里有不同的选择。我假设你有一个 webrtcEp 和一个 recoderEp

从客户端发送音频和视频,但仅录制视频:您将同时发送两者,但必须指示录制器仅存储音频

RecorderEndpoint recoderEp = new RecorderEndpoint.Builder(pipeline, "URI_HERE").withMediaProfile(MediaProfileSpecType.WEBM_AUDIO_ONLY).build();
webrtcEp.connect(recorderEp, MediaProfile.AUDIO);

只发送音频:将getUserMediaoptions 的video 属性设置为false 应该只发送音频。如果不是,则意味着 webrtc 端点在媒体服务器中的协商存在错误。我们有一个类似的场景,但只发送视频,它正在工作。如果没有,请报告,以便我们修复它。

编辑#1:无论如何,指定要记录的媒体类型总是很方便,或者两个端点将通过 connect 方法进行交换,所以第一个项目符号中写的内容适用对两者都有。

EDIT #2 你肯定需要在创建记录器时指定MediaProfileSpecType

【讨论】:

我必须对第二个选项进行排序:仅要求来自 getUserMedia 的麦克风(即约束 video: false, audio: true),因为当用户期望仅音频呼叫和请求摄像头访问权限时,他可能会感到困惑.这似乎是 Kurento WebRtcEndpointRecorderEndpoint 中的错误,因为录制视频+音频的工作方式与仅视频一样。仅请求麦克风时,录音文件的大小保持为 0,并且不会报告错误。将向 Kurento google 小组报告问题。 在 kurento google 组开始讨论该错误:groups.google.com/forum/#!topic/kurento/iIxcmd76C4E 无论如何,您都应该在刻录机中设置媒体配置文件,并在connect方法中连接最明确的媒体配置文件类型。你检查过吗? 我做到了。仅在发送音频流时使用 MediaType.AUDIO,在从浏览器发送视频+音频时也尝试使用 MediaType.AUDIO。在这两种情况下都不起作用 - 录制文件保持为空。 @MadisNõmme 谢谢,我已经编辑了帖子以添加基于该线程的信息,以突出媒体配置文件。它已经在那里了,但我认为似乎并不明显。【参考方案2】:

您可以将视频流的端口设置为零。这应该表明该流在会话期间被拒绝或禁止进一步使用。

m=视频 0 RTP/SAVPF 100

【讨论】:

在您建议的更改之后,PeerConnection#signalingState 进入stable。所以这是一个改进。 RecorderEndpoint 生成的记录文件仍然没有得到任何数据(保持在大小为零)。您还有其他建议吗?有没有办法观察与录制相关的错误事件?我尝试了 RecorderEndpoint#addErrorListener 但 id 没有报告任何内容。 在这一点上,我认为它必须与 Kurento Stack 做更多的事情。理想情况下,这应该得到尊重。除非他们忘记检查禁用流的条件。抱歉……想不出别的了。

以上是关于如何修改仅使用 Kurento 录制音频的答案 SDP?的主要内容,如果未能解决你的问题,请参考以下文章

Kurento实战之六:云端录制

如何使用 Auriotouch 将麦克风的音频输入静音并仅识别设备的内部音频

在 Python 中检测并录制音频为 PCM 格式

在 iOS 上实时录制、修改音高和回放音频

xcode:如何在使用 AVFoundation 录制音频后保存音频文件

修改 SpeakHere 以录制设备上播放的音频