для чего именно используется фильтр gstreamer в Kurento Media Server

Согласно документации Kurento: http://doc-kurento.readthedocs.io/en/stable/mastering/kurento_API.html

GstreamerFilter — это универсальный интерфейс фильтра, который позволяет использовать фильтр GStreamer в Kurento Media Pipelines.

Я пытался найти фильтры Gstreamer в Google, но нашел только плагины Gstreamer. (https://gstreamer.freedesktop.org/documentation/plugin-development/advanced/

Означает ли это, что я могу использовать фильтр Kurento Gstreamer, чтобы добавить к нему такие плагины, как rtph264depay и rtmpsink?

e.g.

WebRTC endpoint > RTP Endpoint > (rtph264depay) Gstreamer filter  (rtmpsink) > RTMP server.

Все без отдельной установки Gstreamer?


person fritz    schedule 24.02.2017    source источник


Ответы (3)


GstreamerFilter позволяет вам настроить фильтр, используя собственный фильтр GStreamer (так же, как при использовании gst-launch-1.0). Например, следующий фильтр Kurento позволяет горизонтально поворачивать ваши медиафайлы в KMS:

GStreamerFilter filter = new GStreamerFilter.Builder(pipeline, "videoflip method=horizontal-flip").build();

Сказав это, и что касается вашего вопроса, насколько мне известно, я так думаю, вы можете использовать GstreamerFilter для использования rtph264depay и rtmpsink.

person Boni García    schedule 24.02.2017
comment
Привет, Бони, есть ли документация по всем этим функциям, предоставляемым GStreamFilter? Пока я работаю над попытками узнать количество лиц. - person abhilash_goyal; 15.03.2017
comment
На самом деле об этом не так много документации, извините. Насколько мне известно, в настоящее время доступен только JavaDoc и JsDoc GStreamerFilter. - person Boni García; 15.03.2017

Код Бони Гарсии правильный.

Но если вы замените "videoflip method=horizontal-flip" на "rtmpsink location=rtmp://deque.me/live/test01", вы получите сообщение об ошибке: "Данная команда недействительна, шаблоны пэдов не совпадают" .

Вы можете углубиться, чтобы проверить исходный код kms-filters на https://github.com/Kurento/kms-filters, в kms-filters/src/server/implementation/objects/GStreamerFilterImpl.cpp есть строчка:

     99     throw KurentoException (MARSHALL_ERROR,
     100                             "Given command is not valid, pad templates does not match");

Боюсь, вы не можете использовать GstreamerFilter для отправки данных на сервер rtmp, возможно, вам следует немного изменить исходный код.

person ZhangFei    schedule 04.03.2017

Куренто

Просто просмотрев источникGStreamerFilter ограничен простыми плагинами GStreamer. Они отвергают мусорные ведра, и я не понимаю, как вы могли бы указать/изолировать несколько пэдов, поэтому, вероятно, это не сработает.

(EDIT: возможно, я ошибаюсь здесь - я все еще учусь. Я вижу микшер пример изоляции типов мультимедиа, и это заставляет меня думать, что это возможно)

gstreamer

С другой стороны, установка gstreamer не должна быть такой уж накладной — тогда свяжите выходное соединение RTP с конвейером gst-launch, который может выводить RTMP. Это просто отстой, что вы не можете управлять полным конвейером с помощью kurento.

(Я не знаю, как будет выглядеть этот пайплайн — сам исследую его. Это что-то вроде этого:

gst-launch-1.5 -v \ udpsrc port=9999 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! mux. \ multifilesrc location=sample.aac loop=1 ! aacparse ! mux. \ mpegtsmux name=mux mux. ! rtpmp2tpay ! queue ! udpsink host=10.20.20.20 port=5000

Но я имитирую звук в этом и не заработал полный поток)

вернуться в куренто

Дальнейшее исследование показало, что, возможно, Композит MediaElement будет работать (tl;dr: нет):

Composite composite = new Composite.Builder(pipeline).build();
HubPort in_audio = new HubPort.Builder(composite).build();
HubPort in_video = new HubPort.Builder(composite).build();
HubPort out_composite = new HubPort.Builder(composite).build();

GStreamerFilter filter = new GStreamerFilter.Builder(pipeline, "rtmpsink location=rtmp://127.0.0.1/live/live_stream_720p").build();

webRtcEndpoint.connect(in_audio, MediaType.AUDIO);
webRtcEndpoint.connect(in_video, MediaType.VIDEO);

out_composite.connect(filter);

результаты (журналы kurento):

...15,011560 21495 [0x4f01700]   debug KurentoWebSocketTransport WebSocketTransport.cpp:422 processMessage()  Message: >{"id":28,"method":"create","params":{"type":"GStreamerFilter","constructorParams":{"mediaPipeline":"5751ec53_kurento.MediaPipeline","command":"rtmpsink location=rtmp://127.0.0.1/live/live_stream_720p"},"properties":{},"sessionId":"d8abb1d8"},"jsonrpc":"2.0"}<
...15,011862 21495 [0x4f01700]   debug KurentoGStreamerFilterImpl GStreamerFilterImpl.cpp:47 GStreamerFilterImpl()  Command rtmpsink location=rtmp://127.0.0.1/live/live_stream_720p
...15,015698 21495 [0x4f01700]   error filterelement             kmsfilterelement.c:148 kms_filter_element_set_filter() <kmsfilterelement0>  Invalid factory "rtmpsink", unexpected pad templates
...15,016841 21495 [0x4f01700]   debug KurentoWebSocketTransport WebSocketTransport.cpp:424 processMessage()  Response: >{"error":{"code":40001,"data":{"type":"MARSHALL_ERROR"},"message":"Given command is not valid, pad templates does not match"},"id":28,"jsonrpc":"2.0"}

т.е. отказ.

person J. Longman    schedule 28.03.2018