Как представить входной файл как прямой эфир? - PullRequest
0 голосов
/ 03 апреля 2019

Я использую gst-rtsp-сервер для потокового видео. Мне нужно потоковое MP4-файл, как живой эфир. Затем я собираюсь сделать цикл и изменить входной файл для имитации живого потока ...

Пока что, если источником является rtsp-поток или v4l2-поток с камеры, GST-RTSP-SERVER создает живой поток (без возможности перемотки назад). Но если источником является mp4-файл - GST-RTSP-SERVER создает поток, который можно перезаписать.

Мой код (он почти такой же, как пример test-mp4.c):

#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>

int main (int argc, char *argv[])
{
  GMainLoop *loop;
  GstRTSPServer *server;
  GstRTSPMountPoints *mounts;
  GstRTSPMediaFactory *factory;
  gchar *str;
  gchar *url;

  char *port = (char *) argv[3];

  GOptionEntry entries[] = {
    {"port", 'p', 0, G_OPTION_ARG_STRING, &port,
        "Port to listen on (default: DEFAULT_RTSP_PORT )", "PORT"},
    {NULL}
  };

  GOptionContext *optctx;
  optctx = g_option_context_new ("<launch line> - Test RTSP Server, Launch\n\n"
    "Example: \"( decodebin name=depay0 ! autovideosink )\"");
  g_option_context_add_main_entries (optctx, entries, NULL);
  g_option_context_free (optctx);

  gst_init (&argc, &argv);

  if (argc < 3) {
    g_message ("usage: %s <filename.mp4> <UUID>", argv[0]);
    return -1;
  }

  loop = g_main_loop_new (NULL, FALSE);
  server = gst_rtsp_server_new ();

  g_object_set (server, "service", port, NULL);

  mounts = gst_rtsp_server_get_mount_points (server);

  str = g_strdup_printf ("( "
      "filesrc location=%s ! qtdemux name=d "
      "d. ! queue ! rtph264pay pt=96 name=pay0 "
      ")", argv[1]);
  factory = gst_rtsp_media_factory_new ();
  gst_rtsp_media_factory_set_launch (factory, str);
  g_free (str);

  url = g_strdup_printf ("/arch/%s", argv[2]);
  g_message ("url: %s", url);

  gst_rtsp_mount_points_add_factory (mounts, url, factory);
  g_object_unref (mounts);
  g_free(url);
  gst_rtsp_server_attach (server, NULL);

  g_main_loop_run (loop);

  return 0;
}

Итак, как представить входной файл src как живой поток?

Заранее спасибо!

...