Зацикливаете видео с помощью gstreamer и gst-launch?

Я могу воспроизвести видео в командной строке с помощью gst-launch gstreamer следующим образом:

gst-launch gnlfilesource location=file:///tmp/myfile.mov start=0 duration=2000000000 ! autovideosink

При этом воспроизводятся первые 2 секунды файла в /tmp/myfile.mov, после чего воспроизведение видео останавливается. Есть ли способ заставить это повторяться постоянно? т.е. превратить 2-секундный gnlfilesource в видео бесконечной длины, которое воспроизводит эти 2 секунды снова и снова?


person Rory    schedule 26.07.2011    source источник


Ответы (5)


Предполагая bash ...

Завернуть в while-петлю?

while true; do [your command]; done

где true ничего не делает успешно, т.е.

true: true
    Return a successful result.

    Exit Status:
    Always succeeds.

Это позволяет создавать бесконечные циклы, например.

$ while true; do echo "run..."; sleep 1; done
run...
run...
run...
run...
run...
...
person Fredrik Pihl    schedule 26.07.2011
comment
С педологической точки зрения это сработает, но я хочу сделать это в gstreamer, чтобы потом обработать этот бесконечный цикл ... - person Rory; 27.07.2011
comment
@Rory - извините, не могу вам помочь, поиск в Google зацикленного видео gst-launch возвращает несколько интересных совпадений ... - person Fredrik Pihl; 29.07.2011
comment
Это не удается при зацикливании видео переменной длины внутри видеомикшера. - person Dejan; 08.01.2012

Если вы используете gst-launch, вам, возможно, придется использовать while true; do [your command]; done, как заявил Фредрик. Однако, если вас интересует код C, я написал код, который может вам помочь. Зацикливание видео каждые 2 секунды от начала файла до конца потока первого запуска.

  //(c) 2011 enthusiasticgeek
  // This code is distributed in the hope that it will be useful,
  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

#include <gst/gst.h>

gboolean bus_callback(GstBus *bus, GstMessage *msg, gpointer data)
{
    GstElement *play = GST_ELEMENT(data);
    switch (GST_MESSAGE_TYPE(msg))
    {
    case GST_MESSAGE_EOS:
        /* restart playback if at end */
        if (!gst_element_seek(play, 
                    1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
                    GST_SEEK_TYPE_SET,  2000000000, //2 seconds (in nanoseconds)
                    GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
            g_print("Seek failed!\n");
        }
        break;
    default:
        break;
    }
    return TRUE;
}

gint
main (gint   argc,
      gchar *argv[])
{
  GMainLoop *loop;
  GstElement *play;
  GstBus *bus;

  /* init GStreamer */
  gst_init (&argc, &argv);
  loop = g_main_loop_new (NULL, FALSE);

  /* make sure we have a URI */
  if (argc != 2) {
    g_print ("Usage: %s <URI>\n", argv[0]);
    return -1;
  }

  /* set up */
  play = gst_element_factory_make ("playbin", "play");
  g_object_set (G_OBJECT (play), "uri", argv[1], NULL);

  bus = gst_pipeline_get_bus (GST_PIPELINE (play));
  gst_bus_add_watch (bus, bus_callback, play);
  gst_object_unref (bus);

  gst_element_set_state (play, GST_STATE_PLAYING);

  /* now run */
  g_main_loop_run (loop);

  /* also clean up */
  gst_element_set_state (play, GST_STATE_NULL);
  gst_object_unref (GST_OBJECT (play));

  return 0;
}

Обновление. См. следующую ссылку http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-dataaccess.html

[Раздел 19.1.2. Воспроизвести область мультимедийного файла]. Это можно было бы использовать вместе с моим кодом.

person enthusiasticgeek    schedule 09.08.2011
comment
Интересно, однако, что временная метка не увеличивается монотонно с этим решением. - person xryl669; 29.10.2015
comment
Как вы это используете, чтобы воспроизвести видео gstreamer ?! Когда я запускаю этот двоичный файл, ничего не происходит ... - person Alexis Wilke; 28.07.2020

Кажется, это возможно с помощью _1 _ плагин,

gst-launch-1.0 multifilesrc location=alien-age.mpg loop=true ! decodebin ! autovideosink

Вроде добавили еще в июне 2011 года.

person Baris Demiray    schedule 26.10.2015
comment
Не зацикливается на Ubuntu 18.04 при потоковой передаче видео с веб-камеры в браузере с v4l2loopback. - person cweiske; 24.03.2020

По словам людей на #gstreamer IRC-канале, вы не можете сделать это с помощью самого gstreamer, вам понадобится что-то вне конвейера gstreamer, чтобы его зациклить.

person Rory    schedule 02.08.2011

Это не зацикливание файла в потоке на gstreamer, но я смог сделать это с опцией ffmpeg -stream_loop. https://ffmpeg.org/ffmpeg.html#Main-options

$ ffmpeg -re -stream_loop -1 -i /tmp/sample.mp4 -f rtsp rtsp://localhost:8554/stream
person toshiya    schedule 17.09.2020
comment
получение Connection to tcp://localhost:8554?timeout=0 failed (Connection refused), trying next address ошибки при попытке работать с этим, - person Prakash Vanapalli; 08.02.2021