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.