10

gst-launch次のようなgstreamerを使用して、コマンドラインでビデオを再生できます。

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

これにより、/tmp/myfile.mov 内のファイルの最初の 2 秒間が再生され、その後、ビデオの再生が停止します。これを繰り返しループさせる方法はありますか?つまり、2 秒の長gnlfilesourceさを無限の長さのビデオに変えて、その 2 秒を何度も何度も再生しますか?

4

6 に答える 6

11

gst-launch を使用している場合はwhile true; do [your command]; done、Fredrik が述べたように使用する必要がある場合があります。ただし、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。メディア ファイルの領域を再生する]。これは、私のコードと組み合わせて使用​​できます。

于 2011-08-09T14:34:18.690 に答える
9

multifilesrcこれはプラグインで可能のようですが、

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

2011年6月に追加されたようです。

于 2015-10-26T16:35:01.277 に答える
4

IRC チャンネルの人々によると#gstreamer、gstreamer 自体でこれを行うことはできず、ループするには gstreamer パイプラインの外部に何かが必要になるとのことです。

于 2011-08-02T11:35:17.773 に答える
3

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

開始し、着信ストリームを待ちます。

別のターミナルで play パイプラインを実行します。

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これで、 with ループで使用できる新しいファイルが作成されました。

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

multifilesrc既知の長さのファイルをループしないのはなぜですか?

メディアの長さがわかると、EOS メッセージを下流に送信し、パイプライン全体を NULL 状態にするため、ファイルの終わり (バイト ストリーム) に達したときにその情報を削除することで、次に再生するファイルを見つけようとします ( 「マルチ」であることを思い出してください)。デフォルトでは、"image_%d.png" のようなワイルドカードの場所を受け入れることができます)。次のファイルを指すワイルドカードがない場合、既知のファイルのみにループ バックします。

于 2021-10-31T08:39:23.473 に答える
0

バッシュを想定...

ループで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...
...
于 2011-07-26T16:32:01.257 に答える