Kurento 媒体服务器中 gstreamer 过滤器的具体用途是什么
what exactly is the use of the gstreamer filter in Kurento Media Server
根据 Kurento 文档:http://doc-kurento.readthedocs.io/en/stable/mastering/kurento_API.html
GstreamerFilter 是一个通用的过滤器接口,允许在 Kurento 媒体管道中使用 GStreamer 过滤器。
我试图在 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 method=horizontal-flip" 替换为 "rtmpsink location=rtmp://deque.me/live/test01",您将收到错误消息:"Given command is not valid, pad templates does not match".
你可以深入查看https://github.com/Kurento/kms-filters中的kms-filter源代码,在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服务器发送数据,也许你应该稍微修改一下源代码。
库伦托
只看 source - GStreamerFilter
仅限于简单的 GStreamer 插件。他们拒绝垃圾箱,我不明白你如何 specify/isolate 多个垫,所以它可能不会这样做。
(编辑:也许我在这里错了 - 我还在学习。我看到混音器 example 隔离媒体类型,这让我觉得这可能是可能的)
gstreamer
另一方面,安装 gstreamer 应该不会有太多开销 - 然后 link 输出 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
但我在这方面伪造了音频,还没有让完整的流工作)
回到库伦托
进一步探索表明 Composite 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"}
即失败。
根据 Kurento 文档:http://doc-kurento.readthedocs.io/en/stable/mastering/kurento_API.html
GstreamerFilter 是一个通用的过滤器接口,允许在 Kurento 媒体管道中使用 GStreamer 过滤器。
我试图在 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 method=horizontal-flip" 替换为 "rtmpsink location=rtmp://deque.me/live/test01",您将收到错误消息:"Given command is not valid, pad templates does not match".
你可以深入查看https://github.com/Kurento/kms-filters中的kms-filter源代码,在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服务器发送数据,也许你应该稍微修改一下源代码。
库伦托
只看 source - GStreamerFilter
仅限于简单的 GStreamer 插件。他们拒绝垃圾箱,我不明白你如何 specify/isolate 多个垫,所以它可能不会这样做。
(编辑:也许我在这里错了 - 我还在学习。我看到混音器 example 隔离媒体类型,这让我觉得这可能是可能的)
gstreamer
另一方面,安装 gstreamer 应该不会有太多开销 - 然后 link 输出 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
但我在这方面伪造了音频,还没有让完整的流工作)
回到库伦托
进一步探索表明 Composite 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"}
即失败。