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のシグナルで対応できるのかと思ったが,こちらのシグナルが発生する前に,エラーが起きるため,対応できなかった。
調べてもなかなか情報が見つからなかったので,ひとまず解決できてよかった。