使用gstreamer和gst-launch循环播放视频



我可以用gstreamer的gst-launch在命令行上播放视频,像这样:

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

这将播放/tmp/myfile中文件的前2秒。Mov,之后视频停止播放。有没有办法让这个重复循环?也就是说,把2秒长的gnlfilesource变成一个无限长的视频,一遍又一遍地播放这2秒?

如果使用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部分。播放媒体文件的一个区域]。这可以与我的代码结合使用。

这似乎是可能的multifilesrc插件,

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

似乎是在2011年6月添加的

根据#gstreamer IRC频道上的人的说法,你不能用gstreamer本身做到这一点,你需要在gstreamer管道之外的一些东西来循环它

multifilesrc是最简单的方法,但它不适用于具有"媒体长度"的媒体文件。已知的。

如果视频文件中没有任何时间或长度的信息,则可以循环播放。

用任何媒体播放器打开你的文件,如果它显示媒体长度,或者如果你可以向前或向后查找文件,这意味着它知道媒体长度,multifilesrc不会循环它。

如何使用GStreamer将视频文件转换为没有时间轨道的文件(流文件):

您需要在命令行上运行两个管道,首先运行记录器:

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中使用loop:
gst-launch-1.0 multifilesrc location=my_timeless_file.mp4 loop=true ! queue ! decodebin ! videoconvert ! ximagesink

为什么multifilesrc不循环已知长度的文件?

因为当媒体长度已知时,它向下游发送EOS消息并导致整个管道将状态为NULL,通过在到达文件(字节流)结束时删除该信息,它试图找到下一个文件播放(记住它是"multi"文件源,默认情况下可以接受通配符位置,如"image_%d.png")。当没有通配符指向下一个文件时,它循环返回到唯一已知的文件。

它不是循环文件在流上的gstreamer,但我能够做到这一点与ffmpeg -stream_loop选项。https://ffmpeg.org/ffmpeg.html主要选项

$ ffmpeg -re -stream_loop -1 -i /tmp/sample.mp4 -f rtsp rtsp://localhost:8554/stream

假设bash…

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...
...

相关内容

  • 没有找到相关文章

最新更新