これは multifilesrc
で可能のようです プラグイン、
gst-launch-1.0 multifilesrc location=alien-age.mpg loop=true ! decodebin ! autovideosink
2011 年 6 月に追加されたようです。
multifilesrc
が最も簡単な方法ですが、「メディアの長さ」がわかっているメディア ファイルでは機能しません。ファイルに時間または長さに関する情報がない場合にのみ、ビデオ ファイルをループできます。
メディアの長さが表示されている場合、またはファイルを前後にシークできる場合は、任意のメディア プレーヤーでファイルを開きます。これは、メディアの長さと multifilesrc
を認識していることを意味します。 ループしません。
GStreamer を使用してビデオ ファイルをタイム トラックのないファイル (ストリーム ファイル) に変換する方法:
コマンド ラインで 2 つのパイプラインを実行する必要があります。最初にレコーダーを実行します。
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
開始し、着信ストリームを待ちます。
別のターミナルでプレイ パイプラインを実行します。
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
再生パイプラインが開始し、ファイル全体をストリーミングすると最終的に終了します。最初のコマンド ラインに戻り、Ctrl+C で記録パイプラインを終了します。
(udpsrc/udpsink の代わりに、appsrc/appsink のような他のメカニズムを使用してストリームを作成できます)
これで multifilesrc
で使用できる新しいファイルができました ループあり:
gst-launch-1.0 multifilesrc location=my_timeless_file.mp4 loop=true ! queue ! decodebin ! videoconvert ! ximagesink
multifilesrc
の理由 既知の長さのファイルをループしませんか?
メディアの長さがわかると、EOS メッセージを下流に送信し、パイプライン全体を NULL 状態にするため、ファイルの終わり (バイト ストリーム) に達したときにその情報を削除することで、次に再生するファイルを見つけようとします ( であることを思い出してください)。 "マルチ" デフォルトでは、"image_%d.png" のようなワイルドカードの場所を受け入れることができます)。次のファイルを指すワイルドカードがない場合、既知のファイルのみにループ バックします。
#gstreamer
の関係者によると IRC チャネル、gstreamer 自体でこれを行うことはできません。gstreamer パイプラインの外部でループする必要があります。
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。メディア ファイルの領域を再生する]。これは、私のコードと組み合わせて使用できます。