我正在使用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());
}
如果需要更多信息来帮助解决这个问题,我会提供。
答案 0 :(得分:2)
要正确生成录像机文件,您需要停止录制或释放录像机端点。我的代码中没有发现这种情况。
要解决此问题,当您完成录制(例如使用完成按钮或类似内容)后,您需要执行以下操作之一
recorderEndpoint.stop(); //this stops the recording
recorderEndpoint.release(); //this stops recording when releasing the recorder
mediaPipeline.release(); //this relases all the pipeline, including recorder
答案 1 :(得分:2)
确保使用RecorderEndpoint设置媒体配置文件,如:
recorderCaller
= new RecorderEndpoint.Builder(pipeline, RECORD_PATH)
.stopOnEndOfStream()
.withMediaProfile(isAudioOnly ? MediaProfileSpecType.MP4_AUDIO_ONLY : MediaProfileSpecType.MP4)
.build();
hubportCaller.connect(recorderCaller);
recorderCaller.record();