GNU/Linux >> Znalost Linux >  >> Linux

Opakujete video s gstreamerem a gst-launch?

Zdá se, že je to možné pomocí multifilesrc plugin

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

Zdá se, že bude přidán v červnu 2011.


multifilesrc je nejjednodušší způsob, ale nebude fungovat na mediálních souborech, které mají známou „délku média“. můžete smyčku na libovolné video soubory pouze v případě, že soubor neobsahuje žádné informace o čase nebo délce.

Otevřete soubor pomocí libovolného přehrávače médií, pokud zobrazuje délku média nebo pokud můžete soubor vyhledat dopředu nebo dozadu, znamená to, že zná délku média a multifilesrc nebude to opakovat.

Jak převést video soubor na soubor bez časové stopy (soubor proudu) pomocí GStreamer:

musíte spustit dvě potrubí na příkazovém řádku, nejprve spusťte záznamník:

gst-launch-1.0 udpsrc port=10600 ! application/x-rtp-stream ! rtpstreamdepay name=pay1 ! rtph264depay ! h264parse ! video/x-h264,alignment=nal ! filesink location=my_timeless_file.mp4

spustí se a čeká na příchozí stream.

na jiném terminálu spusťte kanál přehrávání:

gst-launch-1.0 filesrc location=my_file_with_time_track ! queue ! decodebin ! videoconvert ! x264enc ! h264parse config-interval=-1 ! rtph264pay pt=96 ! rtpstreampay name=pay0 ! udpsink host=127.0.0.1 port=10600

kanál přehrávání se spustí a nakonec skončí, když streamoval celý soubor, nyní se vraťte na první příkazový řádek a ukončete kanál nahrávání pomocí Ctrl+C.

(místo udpsrc/udpsink můžete k vytvoření streamu použít jakékoli jiné mechanismy, jako appsrc/appsink)

Nyní máte nový soubor, který lze použít v multifilesrc se smyčkou:

gst-launch-1.0 multifilesrc location=my_timeless_file.mp4 loop=true ! queue ! decodebin ! videoconvert ! ximagesink

Proč multifilesrc nezacyklí soubory se známou délkou?

Protože když je známa délka média, odešle zprávu EOS downstream a způsobí, že celý kanál přejde do stavu NULL, odstraněním této informace, když dosáhne konce souboru (byte stream), se pokusí najít další soubor k přehrání (nezapomeňte, že je to "více" zdroj souboru a ve výchozím nastavení může přijímat umístění se zástupnými znaky jako "image_%d.png"). Pokud není k dispozici žádný zástupný znak, který by ukazoval na další soubor, vrací se zpět pouze na známý soubor.


Podle lidí na #gstreamer IRC kanál, nemůžete to udělat se samotným gstreamerem, k jeho zacyklení byste potřebovali něco mimo kanál gstreameru.


Pokud používáte gst-launch, možná budete muset použít while true; do [your command]; done jak řekl Fredrik. Pokud vás však zajímá kód C, napsal jsem kód, který vám může pomoci. Smyčka videa každé 2 sekundy od začátku souboru na konci streamu prvního spuštění.

  //(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;
}

Aktualizace: Viz následující odkazhttp://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-dataaccess.html

[Oddíl 19.1.2. Přehrát oblast mediálního souboru]. To by mohlo být použito v konjugaci s mým kódem.


Linux
  1. Šifrování a dešifrování souborů je s GPG snadné

  2. Šifrování a dešifrování souborů pomocí ccrypt

  3. AWK a názvy souborů s mezerou.

  1. Najděte soubory a adresáře v Linuxu pomocí příkazu find

  2. Zachování oprávnění souborů a složek pomocí rsync

  3. Připojte pomocí sshfs a oprávnění k zápisu do souboru

  1. Stáhněte si část videa z Youtube s Youtube-dl a FFmpeg

  2. Procházení souborů s mezerami v názvech?

  3. Přidat zvukový soubor a video Mkv?