GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ein Video mit gstreamer und gst-launch loopen?

Dies scheint mit multifilesrc möglich zu sein Plugin,

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

Scheint im Juni 2011 wieder hinzugefügt worden zu sein.


multifilesrc ist der einfachste Weg, funktioniert aber nicht bei Mediendateien, bei denen die "Medienlänge" bekannt ist. Sie können Videodateien nur wiederholen, wenn die Datei keine Informationen über Zeit oder Länge enthält.

Öffnen Sie Ihre Datei mit einem beliebigen Mediaplayer, wenn er die Medienlänge anzeigt oder wenn Sie die Datei vorwärts oder rückwärts suchen können, das heißt, er kennt die Medienlänge und multifilesrc wird es nicht wiederholen.

So konvertieren Sie mit GStreamer eine Videodatei in eine Datei ohne Zeitspur (Stream-Datei):

Sie müssen zwei Pipelines auf der Befehlszeile ausführen, führen Sie zuerst den Rekorder aus:

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

es startet und wartet auf eingehenden Stream.

Führen Sie auf einem anderen Terminal die Play-Pipeline aus:

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

Die Wiedergabepipeline beginnt und endet schließlich, wenn die gesamte Datei gestreamt wurde. Gehen Sie jetzt zurück zur ersten Befehlszeile und beenden Sie die Aufzeichnungspipeline mit Strg+C.

(Anstelle von udpsrc/udpsink können Sie jeden anderen Mechanismus verwenden, um den Stream zu erstellen, wie appsrc/appsink)

Jetzt haben Sie eine neue Datei, die in multifilesrc verwendet werden kann mit Schleife:

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

Warum multifilesrc loopt Dateien mit bekannter Länge nicht?

Denn wenn die Länge des Mediums bekannt ist, sendet es eine EOS-Nachricht nach unten und bewirkt, dass die gesamte Pipeline in den Zustand NULL geht, indem es diese Informationen entfernt, wenn es das Ende der Datei (Byte-Stream) erreicht, versucht es, die nächste Datei zum Abspielen zu finden (denken Sie daran, es ist "multi" Dateiquelle und akzeptiert standardmäßig Platzhalter wie "image_%d.png"). Wenn es keinen Platzhalter gibt, der auf die nächste Datei zeigt, wird nur zur bekannten Datei zurückgeschleift.


Laut Leuten auf der #gstreamer IRC-Kanal, Sie können dies nicht mit gstreamer selbst tun, Sie würden etwas außerhalb der gstreamer-Pipeline benötigen, um es zu loopen.


Wenn Sie gst-launch verwenden, müssen Sie möglicherweise while true; do [your command]; done verwenden wie Fredrik gesagt hat. Wenn Sie jedoch an C-Code interessiert sind, habe ich einen Code geschrieben, der Ihnen helfen kann. Videoschleife alle 2 Sekunden vom Anfang der Datei am Ende des Streams der ersten Ausführung.

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

Aktualisierung: Siehe folgenden Link http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-dataaccess.html

[Abschnitt 19.1.2. Einen Bereich einer Mediendatei abspielen]. Dies könnte in Verbindung mit meinem Code verwendet werden.


Linux
  1. Finden Sie Dateien und Verzeichnisse unter Linux mit dem Befehl find

  2. Dateiverschlüsselung und -entschlüsselung leicht gemacht mit GPG

  3. Dateiverschlüsselung und -entschlüsselung mit ccrypt

  4. Eine Audiodatei zu einem Mkv-Video hinzufügen?

  5. Suchen Sie eine Datei mit den Befehlen Suchen und Suchen in Linux

Erläuterung von Soft Link und Hard Link in Linux anhand von Beispielen

Bearbeiten von Text mit sed und grep

Wie man mit Hardlinks und Softlinks unter Linux arbeitet

So arbeiten Sie mit File and Shell Provisioner in Vagrant

Linux-Dateiberechtigungen und Eigentumsrechte mit Beispielen erklärt

Verwalten Sie Verzeichnis- und Dateiberechtigungen mit chmod Recursive