Kurento Media Server中GSTREAMER过滤器的使用到底是什么?



根据kurento文档:http://doc-kurento.readthedocs.io/en/stable/mastering/kurento_api.html

GSTREAMERFILTER是一个通用过滤器接口,允许在Kurento Media Pipelines中使用Gstreamer filter。

我试图在Google上找到 GSTREAMER过滤器,我发现的只是 gstreamer插件。(https://gstreamer.freedesktop.org/documentation/plugin-development/advanced/

这是否意味着我可以使用kurento gstreamer过滤器,添加rtph264depay和rtmpsink之类的插件?

例如。

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

全部不单独安装GSTREAMER?

gstreamerfilter允许您使用本机Gstreamer滤波器配置过滤器(与使用gst-launch-1.0时相同的方式相同)。例如,以下Kurento过滤器允许在KMS内水平旋转您的媒体:

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

说,关于您的问题,为了我的最大知识,我认为您可以使用gstreamerfilter使用RTPH264Depay和Rtmpsink。

Boni Garcia的代码正确。

但是,如果您替换" videoflip方法= hifortal-flip"为" rtmpsink location = rtmp://deque.me/live/test01",您将收到一条错误消息:"给定命令是无效的,PAD模板是有效的不匹配"。

您可以更深入地从https://github.com/kurento/kms-filters检查kmms-filter源代码,在kms-filters/src/src/server/instructional/objects/gstreamerfilterimpl.cpp中,有一行:

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

我恐怕您不能使用GSTREAMERFILTER将数据发送到RTMP服务器,也许您应该对源代码进行一些修改。

kurento

仅查看源 - GStreamerFilter仅限于简单的GSTREAMER插件。他们拒绝垃圾箱,我看不到您将如何指定/隔离多个垫子,因此它可能不会做到。

(编辑:也许我在这里错了 - 我仍在学习。我看到混音器示例隔离媒体类型,这使我认为可能是可能的)

gstreamer

另一方面,安装GSTREAMER的开销不应太多 - 然后将输出RTP连接链接到可以输出RTMP的gst-launch管道。很烂,您无法使用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

,但我在这方面伪造了音频,但没有完整的流效果)

回到Kurento

进一步的探索表明,复合MediaElement可能会起作用(TL; DR:NO):

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 logs):

...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"}

即。失败。

相关内容

最新更新