Kurento записывает, не записывает никаких данных

Я немного работаю над учебником one2many call, расширенным учебником one2many call и записью 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());
}

Если для решения этой проблемы потребуется дополнительная информация, я ее предоставлю.


person user1634494    schedule 16.10.2015    source источник
comment
Было бы интересно узнать вашу версию KMS и клиент, который вы используете.   -  person igracia    schedule 16.10.2015
comment
привет, ты решил это?   -  person Marian Klühspies    schedule 07.04.2016


Ответы (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
person lulop    schedule 16.10.2015
comment
Я тоже так думал, но теперь у меня проблемы с записью в любом проекте. One2one-call-advanced больше не работает корректно. Не уверен что происходит - person user1634494; 17.10.2015

Убедитесь, что вы настраиваете профиль мультимедиа с помощью RecorderEndpoint, например:

recorderCaller
                = new RecorderEndpoint.Builder(pipeline, RECORD_PATH)
                        .stopOnEndOfStream()
                        .withMediaProfile(isAudioOnly ? MediaProfileSpecType.MP4_AUDIO_ONLY : MediaProfileSpecType.MP4)
                        .build();
            hubportCaller.connect(recorderCaller);
            recorderCaller.record();
person spidercpsf    schedule 05.12.2015