我正在学习 one2many 呼叫教程、one2many 呼叫高级教程和 hello-world 录音,但我似乎无法让录音正常工作。它创建文件,但它始终是 382 字节,没有可播放的内容。没有抛出任何错误,浏览器和应用服务器之间的通信也正常工作。
处理初始录制请求的代码如下所示:
//1. Media logic
BroadcastPipeline broadcastPipeline = new BroadcastPipeline(kurento, "test-broadcast");
//2. User session
broadcasterUserSession = new UserSession(session);
broadcasterUserSession.setWebRtcEndpoint(broadcastPipeline.getWebRtcEndpoint());
//3. SDP negotiation
String broadcastSdpOffer = jsonMessage.get("sdpOffer").getAsString();
String broadcastSdpAnswer = broadcastPipeline.generateSdpAnswerForBroadcaster(broadcastSdpOffer);
//4. Gather ICE candidates
broadcastPipeline.getWebRtcEndpoint().addOnIceCandidateListener(
new EventListener<OnIceCandidateEvent>() {
@Override
public void onEvent(OnIceCandidateEvent event) {
JsonObject response = new JsonObject();
response.addProperty("id", "iceCandidate");
response.add("candidate", JsonUtils.toJsonObject(event.getCandidate()));
try {
synchronized (session) {
session.sendMessage(new TextMessage(response.toString()));
}
} catch (IOException e) {
log.debug(e.getMessage());
}
}
});
JsonObject startBroadcast = new JsonObject();
startBroadcast.addProperty("id", "broadcasterResponse");
startBroadcast.addProperty("response", "accepted");
startBroadcast.addProperty("sdpAnswer", broadcastSdpAnswer);
synchronized (broadcasterUserSession){
session.sendMessage(new TextMessage(startBroadcast.toString()));
}
broadcastPipeline.getWebRtcEndpoint().gatherCandidates();
broadcastPipeline.startRecording();
UserSession 几乎与 hello-world-recording 相同。然而,BroadcastMediaPipeline 看起来像这样:
public static final String RECORDING_PATH = "file:///tmp/";
public static final String RECORDING_EXT = ".webm";
private final MediaPipeline mediaPipeline;
private final WebRtcEndpoint webRtcEndpoint;
private final RecorderEndpoint recorderEndpoint;
public BroadcastPipeline(KurentoClient kurento, String broadcastTitle){
log.info("Creating Broadcast pipeline");
//Create the media pipeline
mediaPipeline = kurento.createMediaPipeline();
//Create the broadcaster pipeline
webRtcEndpoint = new WebRtcEndpoint.Builder(mediaPipeline).build();
//Create the recording endpoint for the broadcast
recorderEndpoint = new RecorderEndpoint.Builder(mediaPipeline, RECORDING_PATH + broadcastTitle + RECORDING_EXT).build();
webRtcEndpoint.connect(recorderEndpoint);
}
public void startRecording(){
try{
recorderEndpoint.record();
log.info("Started recording broadcast");
}
catch(Exception e){
log.error("Something bad happended: + " + e.getMessage());
}
}
public MediaPipeline getMediaPipeline(){
return mediaPipeline;
}
public String generateSdpAnswerForBroadcaster(String sdpOffer){
return webRtcEndpoint.processOffer(sdpOffer);
}
public WebRtcEndpoint getWebRtcEndpoint(){
return webRtcEndpoint;
}
public WebRtcEndpoint buildViewerEndpoint(){
return (new WebRtcEndpoint.Builder(mediaPipeline).build());
}
如果需要更多信息来帮助解决这个问题,我会提供。