GStreamer: rtspsrcのサーバーエラーの対策

複数のIPカメラの映像をGStreamerのrtspsrcを使って再生している。

その際に,ある一部のIPカメラのRTSPサーバーが停止中の場合,以下のエラーが発生して他の正常なソースも含めて再生が止まってしまうことに気付いた。

Progress: (request) Sent PLAY request
ERROR: from element /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc1: Unhandled error
Additional debug info:
gstrtspsrc.c(6161): gst_rtspsrc_send (): /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc1:
Service Unavailable (503)
Execution ended after 0:00:00.055926379

実運用では,サーバーが停止中ということも十分ありえるので,正常なサーバーのストリームはそのまま継続して再生したい。

調べたところ,以下のように,エラー発生時にパイプラインの状態が停止中になるので,再度再生状態にすれば,残りのrtspsrcの映像を再生できた。


static gboolean bus_callback (GstBus * bus, GstMessage * msg, gpointer data)
{
 switch (GST_MESSAGE_TYPE(msg)) {
  case GST_MESSAGE_EOS:
  case GST_MESSAGE_ERROR:
  {
        gchar *debug;
        GError *error;
        gst_message_parse_error (msg, &error, &debug);
        g_free (debug);

      g_printerr ("Error: %s\n", error->message);
      // rtspsrcでUnhandled error発生時はサーバー停止の可能性がある。
      // 他のソースは有効なことがあるので,パイプラインを再生して継続する。
      if (!strncmp(error->message, "Unhandled error", strlen("Unhandled error"))) {
        GstStateChangeReturn ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);
        if (ret == GST_STATE_CHANGE_FAILURE) {
          GST_ERROR("gst_element_set_state failed: ret=%d", ret);
        }
      }
      g_error_free (error);
  }
  break;
  default:
  break;
 }
 return TRUE;
}

当初,rtspsrcのhandle-requestのシグナルで対応できるのかと思ったが,こちらのシグナルが発生する前に,エラーが起きるため,対応できなかった。

調べてもなかなか情報が見つからなかったので,ひとまず解決できてよかった。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です