2016-04-15 21 views
1

私は突然、私は次のログを取得し始めた今日ヶ月のkurento過去のカップルに取り組んとされています:Kurento:奇妙なログが連続的に発生される「disconnectAll()」

[0x00007f40b9f6d700] debug KurentoMediaElementImpl MediaElementImpl.cpp:660 disconnectAll() <kmswebrtcendpoint3> Retry disconnect all <kmshubport3> 

このログが連続的に発生し、100を引き起こしています複数のログファイルを100 + mbで作成した%cpu使用率。

私はまた、別のログファイルにこのログを得た

2016-04-15 20:05:47,914497 23751 [0x00007fd903de1700] error KurentoWorkerPool   WorkerPool.cpp:41 workerThreadLoop() Unexpected error while running the server: boost::filesystem::last_write_time: No such file or directory: "/var/log/kurento-media-server/media-server_2016-04-15_20-05-18.00049.pid23751.log" 
2016-04-15 20:05:47,914513 23751 [0x00007fd90f7fe700] debug KurentoMediaSet   MediaSet.cpp:470 async_delete() Destroying HubPort -> d1975230-7fcb-498e-8d4a-bfc7afbf8bf2_kurento.MediaPipeline/528783df-ac14-47bc-a7ad-8044721563b9_kurento.HubPort 
2016-04-15 20:05:47,914593 23751 [0x00007fd903de1700] debug KurentoWorkerPool   WorkerPool.cpp:37 workerThreadLoop() Working thread starting 
2016-04-15 20:05:47,917583 23751 [0x00007fd903de1700] debug KurentoMediaSet   MediaSet.cpp:470 async_delete() Destroying Composite -> d1975230-7fcb-498e-8d4a-bfc7afbf8bf2_kurento.MediaPipeline/63c84bc4-0d42-4299-ae22-219c0a603837_kurento.Composite 
2016-04-15 20:06:10,067442 23751 [0x00007fd9cbfff700] debug KurentoMediaSet   MediaSet.cpp:131 doGarbageCollection() Running garbage collector 
2016-04-15 20:10:10,067626 23751 [0x00007fd9cbfff700] debug KurentoMediaSet   MediaSet.cpp:131 doGarbageCollection() Running garbage collector 
2016-04-15 20:14:10,067789 23751 [0x00007fd9cbfff700] debug KurentoMediaSet   MediaSet.cpp:131 doGarbageCollection() Running garbage collector 

注:

私はカスタマイズされたグループ通話Javaの例を使用していると私は私が取得するvadfilterフィルタを使用しているキロフィルタを書かれていますサイレントが検出されるまでそれをgst_bufferオブジェクトにコピーし、curl_easy_performを使用してWebサービスに送信します。私は私がグループ通話会議とWebサービスのIPアドレスを使用しています機械がCLOSE_WAIT状態にリストされていることがわかりますが、私は、彼らがためのCLOSE_WAITであるかどうかわからないのですsudo netstat -np | grep "CLOSE_WAIT"

を使用も

私のプラグインなどでクラッシュする

P.s:私は沈黙が検出されるまで、後続のオーディオバッファをコピーするgst_buffer_copy_deep()gst_buffer_get_memorygst_buffer_append_memoryを使用していました。

私が直面しているエラーに関連するものを誰かが指摘できれば、本当に役に立ちます。

さらに、私はenter link description hereを持っています。私が得ているエラーを参照することができます。ありがとうございました。

編集1:

namespace kurento 
{ 
    namespace module 
    { 
    namespace vadcustomfilter 
    { 
     void VADCustomFilterImpl::newBufferHandler (GstBuffer * buffer) 
     { 
     try 
     { 
      //instead of doing audio_buffer=null we set a flag audio_buffer_null to TRUE when we want to make a new copy of audio_buffer 
      if (!audio_buffer_null) 
      { 
       // dest, source, flag, offset, size 
       //gst_buffer_copy_into (audio_buffer, buffer, GST_BUFFER_COPY_MEMORY, 0, -1); 
       GstMemory *inbuf_memory = gst_buffer_get_memory(buffer,0); 
       gst_buffer_append_memory(audio_buffer,inbuf_memory); 
      } 
      else 
      { 
       audio_buffer = gst_buffer_new(); 
       audio_buffer = gst_buffer_copy_deep (buffer); 
       audio_buffer_null = FALSE; 
      } 
     } 
     catch (std::bad_weak_ptr & e) 
     { 
      GST_ERROR ("EXCEPTION: new buffer"); 
     } 
     } 


     void VADCustomFilterImpl::busMessage (GstMessage * message) 
     { 
     try 
     { 
      switch (message->type) 
      { 
       case GST_MESSAGE_EOS: 
       { 
        GST_WARNING ("---------------> GST_MESSAGE_EOS"); 
       } 
       break; 

       case GST_MESSAGE_ELEMENT: 
       { 
        const GstStructure *structure = gst_message_get_structure (message); 
        if (structure == NULL) return; 

        const gchar *name = gst_structure_get_name (structure); 
        if (name == NULL || strlen(name) == 0) return; 


        if (strcmp (name, "vadfilter") == 0) 
        { 
         //messages are voice , silence, max_voice_reached 
         const GValue *msg_value = NULL; 
         gint64 silence_buffer = 0; 

         gst_structure_get_int64(structure, "silence", &silence_buffer); 
         silence_buffer /= sizeof(gint16); 

         //silence_buffer is the size of buffer which was emitted in chunks before silence was detected 
         //use to check for min voice size 

         if (silence_buffer > 0) 
         { 
          //min_voice_buffer_size set from java server to set a limit of min buffer size which can be sent to the web service 
          if (audio_buffer != NULL && (silence_buffer > (gint64)min_voice_buffer_size)) 
          { 
           audio_buffer_copy = NULL; 
           audio_buffer_copy = gst_buffer_copy_deep(audio_buffer); 

           push_buffer_in_queue(); 
          } 
          return; 
         } 

         gint64 max_voice = 0; 
         gst_structure_get_int64 (structure, "max_voice_reached", &max_voice); 

         if (audio_buffer != NULL && (max_voice > 0)) 
          { 
          audio_buffer_copy = NULL; 
          audio_buffer_copy = gst_buffer_copy_deep(audio_buffer); 
          push_buffer_in_queue(); 
          } 
         } /* vadfilter */ 
        } /* message_element */ 
        break; 

       default: 
        break; 

       } /* switch */ 
      } 
      catch (std::bad_weak_ptr & e) 
      { 
       GST_ERROR("EXCEPTION: bus message"); 
      } 
     } /* bus message */ 


     void VADCustomFilterImpl::push_buffer_in_queue() 
     { 
     try 
     { 
      GstMapInfo map;   
      if (audio_buffer_copy != NULL) 
      { 

       if (gst_buffer_map (audio_buffer_copy, &map, GST_MAP_READ)) 
       { 
        AUDIO_STREAM *pcm = new AUDIO_STREAM; 
        pcm->size = (unsigned int) map.size; 
        pcm->data = new unsigned char[pcm->size + 1]; 
        std::memcpy (pcm->data, (unsigned char *) map.data, pcm->size); 

        gst_buffer_unmap (audio_buffer_copy, &map); 

        //set the flag for audio_buffer to create a new copy 
        audio_buffer_null = TRUE; 
        fetch_response(pcm); 
        if (pcm->data != NULL) 
        {    
         pcm->size = 0; 
         pcm->data = NULL; 
        } 

        if (pcm != NULL) 
        {   
         delete pcm; 
         pcm = NULL; 
        }    
       } 
       else 
        GST_ERROR("push_buffer_in_queue: Invalid buffer"); 


      } 
     } 
     catch (std::bad_weak_ptr & e) 
     { 
      GST_ERROR ("EXCEPTION::push_buffer_in_queue "); 
     } 
     } 

     VADCustomFilterImpl::VADCustomFilterImpl (const boost::property_tree::ptree &conf, 
               std::shared_ptr<MediaPipeline> mediaPipeline, 
               int minVoiceBufferSize, 
               int maxVoiceBufferSize, 
               int64_t minSilenceTime, 
               const std::string &url, 
               const std::string &language):FilterImpl 
               (conf, 
               std::dynamic_pointer_cast <MediaObjectImpl> (mediaPipeline)) 
     { 

     try 
     { 
      min_voice_buffer_size = (gsize) minVoiceBufferSize; 
      curl_url = url ; 
      accept_language = (!language.empty()) ? ("Accept-Language: " + language) : ("Accept-Language: en-US"); 

      g_object_set (element, "filter-factory", "vadfilter", NULL); 

      g_object_get(G_OBJECT(element), "filter", &vadfilter, NULL); 

      if (vadfilter == NULL) 
       { 
       throw KurentoException (MEDIA_OBJECT_NOT_AVAILABLE, "Media Object not available"); 
       } 


      g_object_set(G_OBJECT(vadfilter), "minimum-silence-time", (guint64)minSilenceTime, NULL); //2000000000 
      g_object_set(G_OBJECT(vadfilter), "max-voice-buffer-size", (guint)maxVoiceBufferSize, NULL); 

      g_object_unref(vadfilter); 

      g_async_queue_create(); 

      curl_init(); 
     } 
     catch (std::bad_weak_ptr & e) 
     { 
      GST_ERROR("EXCEPTION: constructor... "); 
     } 
     } 

     void VADCustomFilterImpl::postConstructor() 
     { 
     try 
     { 
      GstBus *bus; 

      std::shared_ptr <MediaPipelineImpl> pipe; 

      FilterImpl::postConstructor(); 

      pipe = std::dynamic_pointer_cast <MediaPipelineImpl>(getMediaPipeline()); 

      bus = gst_pipeline_get_bus (GST_PIPELINE (pipe->getPipeline())); 

      /* register bus message handler */ 
      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())); 

      /* register new_buffer handler */ 
      remove_silence_id = register_signal_handler(G_OBJECT(vadfilter), 
            "buffer", 
            std::function < 
            void (GstElement *, 
             GstBuffer *) > 
            (std:: 
             bind 
             (&VADCustomFilterImpl:: 
             newBufferHandler, this, 
             std::placeholders:: 
             _2)), 
            std:: 
            dynamic_pointer_cast < 
            VADCustomFilterImpl > 
            (shared_from_this())); 

      if (bus) 
       g_object_unref (bus); 
     } 
      catch (std::bad_weak_ptr & e) 
     { 
      GST_ERROR("EXCEPTION: post constructor... "); 
     } 
     } 

     VADCustomFilterImpl::~VADCustomFilterImpl() 
     { 
     std::shared_ptr <MediaPipelineImpl> pipe; 

     try 
     {   
      if (bus_handler_id > 0) 
      { 
      pipe = std::dynamic_pointer_cast <MediaPipelineImpl> (getMediaPipeline()); 
      GstBus *bus = gst_pipeline_get_bus (GST_PIPELINE (pipe->getPipeline())); 
      if (bus) 
      { 
       unregister_signal_handler (bus, bus_handler_id); 
       g_object_unref (bus); 
      } 

      } 

      /*if (remove_silence_id > 0) 
      { 
       unregister_signal_handler (element, remove_silence_id); 
      } 
      */ 

      /* curl cleanup */ 
      curl_cleanup(); 

      /* buffer queue cleanup */ 
      if (g_async_buffer_queue) 
      { 
       g_async_queue_unref (g_async_buffer_queue); 
       g_async_buffer_queue = NULL; 
      } 


      /* audio_buffer cleanup */ 
      if (audio_buffer_copy != NULL) 
      { 
       audio_buffer_copy = NULL; 
      } 

      if (audio_buffer != NULL) 
      { 
       audio_buffer = NULL; 
       audio_buffer_null = TRUE; 
      } 

     } 
     catch (std::bad_weak_ptr & e) 
     { 
      remove_silence_id = -1; 
      GST_ERROR("EXCEPTION: destructor "); 
     } 
     } 


     size_t VADCustomFilterImpl::curl_callback (char *contents, size_t size, 
         size_t nmemb, void *userp) 
     { 
     size_t realsize = 0; 
     try 
     { 
      realsize = size * nmemb; /* calculate buffer size */ 
      ((std::string *) userp)->append ((char *) contents, realsize); 
     } 
     catch (std::bad_weak_ptr & e) 
     { 
      GST_ERROR("EXCEPTION: curl_callback"); 
     } 
     return realsize; 
     } 

     int VADCustomFilterImpl::curl_init() 
     { 
     /* init curl handle */ 
     if ((curl_handle = curl_easy_init()) == NULL) 
      return 1; 


     /* set content type */ 
     headers = curl_slist_append (headers, "Accept: application/xml"); 

     headers = curl_slist_append (headers, "Transfer-Encoding: chunked"); 
     headers = curl_slist_append (headers, accept_language.c_str());  

     /* set curl options */ 
     curl_easy_setopt (curl_handle, CURLOPT_VERBOSE, 0); 
     curl_easy_setopt (curl_handle, CURLOPT_POST, 1); 
     curl_easy_setopt (curl_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
     curl_easy_setopt (curl_handle, CURLOPT_HTTPHEADER, headers); 
     curl_easy_setopt (curl_handle, CURLOPT_TIMEOUT, 10);   
     curl_easy_setopt (curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); /* set default user agent */     
     curl_easy_setopt (curl_handle, CURLOPT_URL, curl_url.c_str()); /* set url to fetch */  

     return 0; 
     } 


     int VADCustomFilterImpl::curl_fetch (AUDIO_STREAM * pcm) 
     { 
     curl_op_in_progress = TRUE; 

     if (curl_handle == NULL) 
      return 1; 

     CURLcode rcode; 

     try 
     { 
      response.clear(); 
      curl_easy_setopt (curl_handle, CURLOPT_WRITEFUNCTION, curl_callback); /* set calback function */   
      curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &response);/* pass fetch struct pointer */ 
      curl_easy_setopt (curl_handle, CURLOPT_POSTFIELDSIZE, pcm->size); 
      curl_easy_setopt (curl_handle, CURLOPT_POSTFIELDS, pcm->data); 

      rcode = curl_easy_perform(curl_handle); 

      handle_curl_response(rcode); 
     } 
     catch (std::bad_weak_ptr & e) 
     { 
      GST_ERROR("EXCEPTION: curl_fetch "); 
     } 


     return 1; 
     } 

    void VADCustomFilterImpl::handle_curl_response(CURLcode rcode) 
    { 
     curl_op_in_progress = FALSE; 
     switch (rcode) 
     { 
      case CURLE_OK: 
      { 

       if (!response.empty()) 
       { 
        SendresponseReceivedEvent(response); 
        response.clear(); 
       } 
      } 
       break; 

      case CURLE_OPERATION_TIMEDOUT: 
      case CURLE_HTTP_RETURNED_ERROR: /* HTTP Error, >= 400*/ 
      { 
       GST_ERROR ("ERROR: handle_curl_response: (%s)", curl_easy_strerror (rcode)); 

       goto pop_pcm_from_queue; 
      } 
      break; 

      default: 
       GST_ERROR ("ERROR: Failed to fetch url (%s) - curl said: %s\n", curl_url.c_str(), curl_easy_strerror (rcode)); 
       break; 
     } /* switch */ 



     pop_pcm_from_queue: 
      if (g_async_queue_length (g_async_buffer_queue) > 0) 
       { 
       AUDIO_STREAM *pcm_popped = reinterpret_cast < AUDIO_STREAM * >(g_async_queue_pop (g_async_buffer_queue)); 
       curl_fetch (pcm_popped); 

       } 
      else 
       GST_ERROR ("handle_curl_response: queue is empty, no pcm to pop out"); 
    } 

    void VADCustomFilterImpl::curl_cleanup() 
    { 
     if (curl_handle) 
      curl_easy_cleanup (curl_handle); 

     /* free headers */ 
     if (headers) 
      curl_slist_free_all (headers); 

     curl_url.clear(); 
    } 

    /* fetch the response from web service, if it is already fetching the push the current audio buffer in queue */ 
    void VADCustomFilterImpl::fetch_response(AUDIO_STREAM * pcm) 
    { 
    //check queue size if > 0 then push else hit curl 
    if (!curl_op_in_progress) 
     { 
     curl_fetch (pcm); 
     } 
    else 
     { 
     try 
     {   
      if (g_async_buffer_queue == NULL) 
       g_async_queue_create(); 

      g_async_queue_push (g_async_buffer_queue, pcm); 
     } 
     catch (std::bad_weak_ptr & e) 
     { 
      GST_ERROR("EXCEPTION: curl_fetch "); 
     } 

     } 
    } 

     void VADCustomFilterImpl::g_async_queue_create() 
     { 
     g_async_buffer_queue = g_async_queue_new(); 
     } 
     }   /* vadcustomfilter */ 
    }  /* module */ 
}  /* kurento */ 

答えて

1

ここと、この他related questionにあなたが提供する情報を与えます。私はかなりの問題は、あなたのフィルタが(おそらくHTTPリクエストを送信しているという事実のために)メディアフローをブロックしているということです。さらに、バッファやミニオブジェクトに関連するエラーは、メディアの処理中にフィルタで何か問題が起きていることを示しています。

コードを確認して、問題の原因を専門家に相談してください。ソースコードにアクセスしなくても、あなたが提供した情報で推測するだけでは分かりにくいかもしれません。ソースコードであっても、デッドロックを引き起こす原因を特定することは難しいでしょう。

+0

こんにちは、私はソースコードを追加しました、plsチェックeidt –

関連する問題