- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试在 kurento 上应用一些 GStreamer 插件 mediapipeline
,在这里我希望 Gstreamer 代码在独立程序中运行良好,以发送与 cutter
相关的回调消息。 .
以下是我的代码:
namespace kurento
{
namespace module
{
namespace vadcustomfilter
{
std::string Id = "";
void VADCustomFilterImpl::busMessage(GstMessage * message)
{
GST_ERROR("***In BusMessage***");
if (message->type == GST_MESSAGE_EOS)
{
g_object_set(G_OBJECT(valve), "drop", FALSE, NULL);
}
const GstStructure *s = gst_message_get_structure(message);
const gchar *name = gst_structure_get_name(s);
GST_INFO("Name: %s\n", name);
if (message->type == GST_MESSAGE_ELEMENT)
{
if (strcmp(name, "cutter") == 0)
{
GstClockTime time = 0;
GstClockTime prevsilencetime = 0;
if (!gst_structure_get_boolean(s, "above", &above))
{
GST_ERROR("could not parse above");
}
GST_INFO("above: %d", above);
if (above)
{
if (isSpeaking == 0)
{
revsilencetime = time;
g_object_set(G_OBJECT(valve), "drop", FALSE, NULL);
}
/*Send Voice Detected Event */
try
{
GST_ERROR("Sending Event: VoiceDetected");
VoiceDetected event(shared_from_this(), "voice-detected", Id.c_str());
signalVoiceDetected(event);
GST_ERROR("Sent Event: VoiceDetected");
}
catch (std::bad_weak_ptr & e)
{
GST_ERROR("EXCEPTION: Voice activity detected ");
}
isSpeaking = 1;
}
else
{
if (isSpeaking == 1)
{
g_object_set(G_OBJECT(valve), "drop", TRUE, NULL);
}
isSpeaking = 0;
}
}
}
}
VADCustomFilterImpl::VADCustomFilterImpl(const boost::property_tree::
ptree & config,
std::shared_ptr <
MediaPipeline > mediaPipeline,
const std::string &pipelineId) :FilterImpl
(config,
std::dynamic_pointer_cast <MediaObjectImpl> (mediaPipeline))
{
-->Edit Start
g_object_set (element, "filter-factory", "audioconvert", NULL);
g_object_get (G_OBJECT (element), "filter", &audioconvertfilter, NULL);
if (audioconvertfilter == NULL) {
throw KurentoException (MEDIA_OBJECT_NOT_FOUND, "MediaObject not found: audioconvertfilter");
}
g_object_set (element, "filter-factory", "cutter", NULL);
g_object_get (G_OBJECT (element), "filter", &cutterfilter, NULL);
if (cutterfilter == NULL) {
throw KurentoException (MEDIA_OBJECT_NOT_FOUND, "MediaObject not found: cutterfilter");
}
g_object_set (G_OBJECT (cutterfilter), "threshold-dB", -39.0, NULL);
g_object_set (G_OBJECT (cutterfilter), "run-length", 400000000, NULL);
g_object_set (element, "filter-factory", "vadcustomfilter", NULL);
g_object_get (G_OBJECT (element), "filter", &vadCustomFilter, NULL);
bus_handler_id = 0;
GST_ERROR("PipelineId: constructor %s",pipelineId.c_str());
Id = pipelineId;
-->Edit End
}
void VADCustomFilterImpl::postConstructor()
{
GstBus *bus;
std::shared_ptr < MediaPipelineImpl > pipe;
FilterImpl::postConstructor();
pipe =
std::dynamic_pointer_cast <MediaPipelineImpl>
(getMediaPipeline());
g_assert(pipe);
/* #1. Add cutter filter here */
create_gst_cutter_filter(pipe);
bus = gst_pipeline_get_bus(GST_PIPELINE(pipe->getPipeline()));
g_assert(bus);
bus_handler_id = register_signal_handler(G_OBJECT(bus),
"message",
std::function <
void(GstElement *,
GstMessage *) >
(std::bind
(&VADCustomFilterImpl::
busMessage, this,
std::placeholders::_2)),
std::dynamic_pointer_cast <
VADCustomFilterImpl>
(shared_from_this()));
GST_ERROR("busMessage added successfully.");
g_object_unref(bus);
}
VADCustomFilterImpl::~VADCustomFilterImpl()
{
std::shared_ptr < MediaPipelineImpl > pipe;
if (bus_handler_id > 0)
{
pipe =
std::dynamic_pointer_cast <MediaPipelineImpl>
(getMediaPipeline());
GstBus *bus =
gst_pipeline_get_bus(GST_PIPELINE(pipe->getPipeline()));
unregister_signal_handler(bus, bus_handler_id);
g_object_unref(bus);
}
}
MediaObjectImpl *VADCustomFilterImplFactory::createObject(const boost::
property_tree::
ptree &
config,
std::
shared_ptr <
MediaPipeline
>
mediaPipeline,
const std::string &pipelineId)
const
{
GST_ERROR("Pipeline Id createObject %s", pipelineId.c_str());
return new VADCustomFilterImpl(config, mediaPipeline, pipelineId.c_str());
}
VADCustomFilterImpl::StaticConstructor VADCustomFilterImpl::
staticConstructor;
VADCustomFilterImpl::StaticConstructor::StaticConstructor()
{
GST_DEBUG_CATEGORY_INIT(GST_CAT_DEFAULT, GST_DEFAULT_NAME, 0,
GST_DEFAULT_NAME);
}
}/* vadcustomfilter */
}/* module */
}/* kurento */
总的来说,我已经为我在代码中遇到的问题添加了评论。
我正在收到 GstMessageTag
的回调我使用 gst_structure_get_name(name)
在日志中打印了它但我没有收到关于 cutter
的任何回调
代码流程中是否有任何遗漏/错误?
编辑: 删除了 gstreamer 添加插件过滤器的方式,尝试添加 audioconvert
cutter
在 element
但我在 addIceCandidate
上遇到错误:
Req-> {"id":13,"method":"invoke","params":{"object":"ff394885-ff7b-4cd2-ac83-190ab58056c3_kurento.MediaPipeline/4911aa60-27e4-461e-86c0-10532bc30d4f_kurento.WebRtcEndpoint","operation":"addIceCandidate","operationParams":{"candidate":{"sdpMid":"audio","__module__":"kurento","sdpMLineIndex":0,"__type__":"IceCandidate","candidate":"candidate:1226269011 1 udp 2122260223 172.24.9.207 62808 typ host generation 0 ufrag nSC45+9JNTCJm+yr"}},"sessionId":"15daae09-de86-4293-a3de-28f33f2d0b16"},"jsonrpc":"2.0"}
Res {"id":13,"error":{"code":40401,"message":"Error adding candidate","data":{"type":"ICE_ADD_CANDIDATE_ERROR"}},"jsonrpc":"2.0"}
最佳答案
您创建 gstreamer 元素的方式似乎不是 Kurento 期望的方式。基本上,您是在 create_gst_cutter_filter
函数中创建未正确链接的元素。
如果您正在创建一个过滤器,所有 gstreamer 的东西(创建元素并连接它们)都应该在您称为 vadcustomfilter
的 gstreamer 元素中完成,这个元素只需要一个接收器和一个 src 垫。
如果您想创建一种不同类型的元素,因为您正在添加 multtifilesink,您需要从 MediaElement 扩展并创建一个从 KmsElement
扩展的 gstreamer 元素。您可以在 kms-elements project 中查看相关示例.
编辑:
关于服务器返回的错误。好像和这里的问题无关,而是一个依赖问题。回来查看 this question并检查你是否有同样的问题
关于c++ - Kurento:无法接收来自 GStreamer 元素 "cutter"的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35934790/
安装 kurento-media-server-6.0 时,它自动创建了一个额外的帐户“kurento”,密码仍然未知。虽然它没有 sudo 访问权限,但不需要的用户帐户仍然是一个安全问题。删除用户帐
我已经在本地机器上安装了最新稳定版本的Kurento Media Server(KMS),规范为Ubuntu 16.04 Xenial,遵循this documentation .我已经验证了所有内容
谁能解释一下我们在 kurento.conf.json 文件中的各种参数。 尝试创建对象时引发异常的资源使用限制"exceptionLimit": "0.8" 但是我看到这个参数在配置文件中被注释了,
我正在尝试为数千个并发调用扩展 kurento 媒体服务器。 我打算使用 OpenVidu Pro 进行缩放。 我还保留了另一种方法来开发自己的应用服务器和管理 kms 节点。 我担心的是与 kms
我想向 webrtc 对等体发送 2 个媒体流。我正在使用 kurento 媒体服务器和 kurento 客户端 API。 Kurento 客户端 API 允许我在创建 webRTC 对等连接之前设置
使用 kurento 教程 java 示例。我想处理 webrtcpeer 对象上的流事件,例如 onend 等。以下是我想要获取流对象的示例代码。 var options = {
我想将 Kurento 主要用作 WebRTC 到 RTP 网关和一些过滤器。在浏览器中,我使用浏览器的 native WebRTC API。 我想在我的 Node 应用服务器中创建一个 WebRTC
我在 kurento 的 java 文档中读到了这两个 webrtcendpoint和 rtpendpoint .但它们都表明它们以非常相似的方式发挥作用。两者都可以作为要约方和受约方来交换媒体。 我
我正在学习 one2many 调用教程、one2many 调用高级教程和 hello-world 录音,但我的录音似乎无法正常工作。它创建了文件,但它始终是 382 字节,没有可播放的内容。没有抛出任
我正在尝试在 Ubutu Trusty (14.04) 中安装最新稳定版本的 Kurento (V 6.0)。不幸的是,我收到了陌生人的消息: 输出: The following packages h
我想创建多个广播 session ,(比如聊天室,所以每个广播可以有 n 个主播给不同的观众组)。 是否可以进行多个广播 session ?如果是这样,我怎么能做到这一点?我可以做一些类似于 gith
我在使用 kurento-java-tutorial one-2-one-call-recording 示例和我运行的任何其他项目时遇到问题,当我注册用户并尝试调用另一个注册用户时,它要求摄像头和麦克
我使用Kurento Media Server 6.0作为MCU来进行一对多通信。我正在尝试重新协商媒体流切换的 SDP。为此,我使用以下代码: 设 webRtcEndPoint 为某个 MediaP
我有最新版本的 Kurento 媒体服务器 v6.4.0,当我尝试与 kurento 建立连接时,它返回错误 { [Error: Error adding candidate] code: 40401
我有 2 个 WebRtcEndpoint(调用方和被调用方)。这些端点相互连接以共享其流。这个沟通没有问题。每个对等点都会获取另一个对等点的流,而不会丢失任何帧。 我想并排录制这两个流。我的搜索结果
这个问题与this有关(基本上,MPEG 有效,但想尝试实现更好的解决方案) 我一直在试用 kurento 的 magic mirror 要求:输出流必须模糊输入流的所有区域,除了人脸。 我的实现计划
我正在尝试 kureno 的教程 http://doc-kurento.readthedocs.org/en/stable/tutorials/java/tutorial-1-helloworld.h
我从 github 获得了 kurento 示例视频应用程序。这对点对点通话很有用。我试着在 kurento 中进行群组视频通话。我无法获得正确的代码。我需要正确的代码来进行群组视频通话。 最佳答案
我做了什么: 我正在使用 Kurento Media Server 在服务器中存储视频流帧。我可以使用 opencv-plugin 示例将帧存储在服务器中。 我在以下两种情况下存储视频帧。 1) I
我对 kurento 媒体服务有疑问。有时它会因下一个警告和错误而中断(不幸的是 kurento 日志没有时间戳): 第一期:我有很多下一个警告: (kurento-media-server:1773
我是一名优秀的程序员,十分优秀!