Не могу записать аудио / видео с Куренто - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь записать аудио и видео с помощью Kurento. Но я не могу понять, где проблема, СМИ просто не записывают. Я вижу только пустые файлы.

Также, когда я пытаюсь остановить запись, позвонив по номеру recorder.stop(), я увидел в журнале kms сообщение: KurentoUriEndpointImpl UriEndpointImpl.cpp:180:stop:<kmsrecorderendpoint8> Error: Already in state stop. То же самое, позвонив по номеру pipeline.release(), я вижу в логах kms это сообщение: Object 'OBJECT_UUID_HERE_kurento.MediaPipeline' not found (Code:40101, Type:null, Data: {"type":"MEDIA_OBJECT_NOT_FOUND"}). Кажется, объекты созданы, но их невозможно найти.

Вот мое определение кмс для составления докера:

version: '3'
services:
  kms:
      image: kurento/kurento-media-server:6.7.2-trusty
      network_mode: host
      ports:
          - '8888:8888'
      volumes:
          - ./data/recordings:/var/kurento

Вот мой код приложения:

public Recording start(StartRecording message) {
    MediaPipeline pipeline = kurentoClient.createMediaPipeline();

    WebRtcEndpoint webRtcEndpoint = new WebRtcEndpoint.Builder(pipeline).build();

    MediaProfileSpecType profile = buildMediaProfile(message.getType()); // I'm sure that the profile is correct.
    RecorderEndpoint recorder = new RecorderEndpoint.Builder(pipeline, "file:///var/kurento/Recorded.webm")
            .withMediaProfile(profile)
            .build();
    recorder.addTag(TAG_KEY_ID, UUID.randomUUID().toString());

    switch (profile) {
        case WEBM:
            webRtcEndpoint.connect(recorder, MediaType.VIDEO);
            webRtcEndpoint.connect(recorder, MediaType.AUDIO);
        case WEBM_VIDEO_ONLY:
            webRtcEndpoint.connect(recorder, MediaType.VIDEO);
        case WEBM_AUDIO_ONLY:
            webRtcEndpoint.connect(recorder, MediaType.AUDIO);
    }

    // Never actually calling.
    webRtcEndpoint.addMediaStateChangedListener(event -> {
        log.info("Media state changed");
        if (event.getNewState() == MediaState.CONNECTED) {
            log.info("Trying to start recording");
            //recorder.record();
        }
    });
    String sdpAnswer = webRtcEndpoint.processOffer(message.getSdpOffer());

    recorder.record();

    recorders.put(recorder.getTag(TAG_KEY_ID), recorder);

    log.debug("The record have been requested to start");

    Recording recording = Recording.withStatus(Recording.Status.STARTING);
    recording.setRecordingId(recorder.getTag(TAG_KEY_ID));
    recording.setSdpAnswer(sdpAnswer);

    return recording;
}

И мой код интерфейса:

const client = Stomp.client('ws://127.0.0.1:8080/recording');
client.connect(
  {},
  () => {
    const webRtcPeer = KurentoUtils.WebRtcPeer.WebRtcPeerSendonly(
      {
        mediaConstraints: {
          audio: true,
          video: false,
        },
      },
      error => {
        if (error) {
          console.error(error);
          return;
        }

        webRtcPeer.generateOffer((error, sdpOffer) => {
          if (error) {
            console.error('Error occurred while generating SDP offer');
            console.error(error);
            return;
          }

          console.log('SDP offer generated');

          client.send('/recording/start', {}, JSON.stringify({sdpOffer: sdpOffer, type: 'AUDIO'}));

          client.subscribe('/topic/recordings', (message) => {
            const body = JSON.parse(message.body);
            if (body.status === 'STARTING') {
              webRtcPeer.processAnswer(body.sdpAnswer, error => {
                if (error) {
                  console.error('Error occurred while precessing SDP answer');
                  console.error(error);
                  return;
                }

                console.log('SDP answer processed');
              });
            }
          });
        });
      }
    );
  }
);

Спасибо за вашу помощь!

...