GNU/Linux >> Belajar Linux >  >> Linux

Mengulangi video dengan gstreamer dan gst-launch?

Hal ini tampaknya dapat dilakukan dengan multifilesrc pengaya,

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

Tampaknya ditambahkan kembali pada Juni 2011.


multifilesrc adalah cara termudah, tetapi tidak akan berfungsi pada file media yang memiliki "Panjang media". Anda dapat mengulangi file video apa pun hanya jika file tidak memiliki informasi tentang waktu atau durasi.

Buka file Anda dengan pemutar media apa pun, jika itu menunjukkan panjang media atau jika Anda dapat mencari maju atau mundur file, itu berarti ia mengetahui panjang media dan multifilesrc tidak akan mengulangnya.

Cara mengonversi file video menjadi file tanpa trek waktu (file streaming) dengan GStreamer:

Anda perlu menjalankan dua jalur pipa pada baris perintah, pertama-tama jalankan perekam:

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

itu dimulai dan menunggu aliran masuk.

di terminal lain jalankan play pipeline:

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

play pipeline dimulai dan akhirnya berakhir saat streaming seluruh file, sekarang kembali ke baris perintah pertama dan hentikan pipeline perekaman dengan Ctrl+C.

(alih-alih udpsrc/udpsink, Anda dapat menggunakan mekanisme lain untuk membuat streaming, seperti appsrc/appsink)

Sekarang Anda memiliki file baru yang dapat digunakan di multifilesrc dengan lingkaran:

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

Mengapa multifilesrc tidak mengulang file dengan panjang yang diketahui?

Karena ketika panjang media diketahui ia mengirim pesan EOS ke hilir dan menyebabkan seluruh pipa menjadi NULL, dengan menghapus informasi itu ketika mencapai akhir file (aliran byte) ia mencoba menemukan file berikutnya untuk diputar (ingat itu adalah "banyak" sumber file, dan secara default dapat menerima lokasi wildcard seperti "image_%d.png"). Jika tidak ada karakter pengganti untuk menunjuk ke file berikutnya, file akan kembali ke file yang diketahui saja.


Menurut orang-orang di #gstreamer Saluran IRC, Anda tidak dapat melakukan ini dengan gstreamer itu sendiri, Anda memerlukan sesuatu di luar jalur pipa gstreamer untuk memutarnya.


Jika menggunakan gst-launch maka Anda mungkin harus menggunakan while true; do [your command]; done seperti yang dikatakan Fredrik. Namun jika tertarik dengan kode C, saya telah menulis sebuah kode yang dapat membantu Anda. Pengulangan video setiap 2 detik dari awal file pada akhir streaming pertama kali dijalankan.

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

Perbarui: Lihat tautan berikuthttp://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-dataaccess.html

[Bagian 19.1.2. Mainkan wilayah file media]. Ini dapat digunakan dalam konjugasi dengan kode saya.


Linux
  1. Temukan file dan direktori di Linux dengan perintah find

  2. Unduh Sebagian Video Youtube dengan Youtube-dl Dan FFmpeg

  3. Lutris – Instal dan Mainkan Game Linux dengan Mudah

  1. Temukan File dengan Perintah Temukan dan Temukan di Linux

  2. AWK dan nama file dengan spasi di dalamnya.

  3. Mempertahankan izin file dan folder dengan rsync

  1. Enkripsi dan dekripsi file menjadi mudah dengan GPG

  2. Enkripsi dan dekripsi file dengan ccrypt

  3. dd dengan obs dan seek membuat file dengan ukuran yang tidak terduga