使用 gstreamer 和 gst-launch 循环播放视频?
我可以使用 gstreamer 的 gst-launch 在命令行上播放视频,如下所示:
gst-launch gnlfilesource location=file:///tmp/myfile.mov start=0 duration=2000000000 ! autovideosink
这将播放 /tmp/myfile.mov 中文件的前 2 秒,然后视频播放停止。有没有办法让它重复循环?即将2秒长的gnlfilesource
变成一个无限长度的视频,一遍又一遍地播放这2秒?
I am able to play a video on the command line with gstreamer's gst-launch
like this:
gst-launch gnlfilesource location=file:///tmp/myfile.mov start=0 duration=2000000000 ! autovideosink
This plays the first 2 seconds of the file in /tmp/myfile.mov, afterwards the video playback stops. Is there anyway to get this to loop repeatidly? i.e. turn the 2 second long gnlfilesource
into an infinite length video that plays those 2 seconds again and again and again?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
如果使用 gst-launch 那么你可能必须使用
while true;执行[你的命令];正如 Fredrik 所说,已完成。但是,如果对 C 代码感兴趣,我编写的代码可能会对您有所帮助。在第一次运行的流末尾,从文件开头开始每 2 秒循环播放一次视频。
更新:
请参阅以下链接
http://gstreamer.freedesktop.org/data /doc/gstreamer/head/manual/html/chapter-dataaccess.html
[第 19.1.2 节。播放媒体文件的某个区域]。这可以与我的代码结合使用。
If using gst-launch then you may have to use
while true; do [your command]; done
as Fredrik has stated. However if interested in C code, I have written a code which may help you. Looping of video every 2 seconds from the beginning of the file at the end of the stream of first run.Update:
See the following link
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-dataaccess.html
[Section 19.1.2. Play a region of a media file]. This could be used in conjugation with my code.
这似乎可以通过
multifilesrc 实现
插件,似乎是在 2011 年 6 月添加的。
This seems to be possible with
multifilesrc
plugin,Seems to be added back in June 2011.
multifilesrc
是最简单的方法,但它不适用于已知“媒体长度”的媒体文件。仅当文件没有任何有关时间或长度的信息时,您才可以循环播放任何视频文件。使用任何媒体播放器打开您的文件,如果它显示媒体长度或者您可以向前或向后搜索文件,则意味着它知道媒体长度并且
multifilesrc
不会循环它。如何使用 GStreamer 将视频文件转换为没有时间轨迹的文件(流文件):
您需要在命令行上运行两个管道,首先运行录制器:
它启动并等待传入流。
在另一个终端上运行播放管道:
播放管道在传输整个文件时启动并最终终止,现在返回到第一个命令行并使用 Ctrl+C 终止记录管道。
(您可以使用任何其他机制来制作流,而不是 udpsrc/udpsink,例如 appsrc/appsink)
现在您有了一个可以在带有循环的
multifilesrc
中使用的新文件:为什么
multifilesrc< /code> 不循环已知长度的文件?
因为当媒体长度已知时,它会向下游发送 EOS 消息并导致整个管道进入 NULL 状态,通过在到达文件末尾(字节流)时删除该信息,它会尝试找到下一个要播放的文件(记住它是 “multi”文件源,默认情况下可以接受通配符位置,例如“image_%d.png”)。当没有通配符指向下一个文件时,它将循环回仅已知的文件。
multifilesrc
is the easiest way, but it won't work on media files that have "Media length" known. you can loop on any video files only if file does not have any information about the time or length.Open your file with any media player, if it shows media length or if you can seek the file forward or backward, that means it knows the media length and
multifilesrc
won't loop it.How to convert video file into file without time track (stream file) with GStreamer:
you need to run two pipelines on command line, first run the recorder:
it starts and waits for incoming stream.
on another terminal run the play pipeline:
play pipeline starts and eventually terminates when it streamed whole file, now go back to the first command line and terminate recording pipeline with Ctrl+C.
(instead of udpsrc/udpsink you can use any other mechanisms to make the stream, like appsrc/appsink)
Now you have a new file which can be used in
multifilesrc
with loop:Why
multifilesrc
does not loop files with known length?Because when length of media is known it sends EOS message downstream and causes whole pipeline going to state NULL, by removing that information when it reaches end of file (byte stream) it tries to find next file to play (remember it is "multi" file source, and by default can accept wildcard location like "image_%d.png"). When there is no wildcard to point to the next file, it loops back to only known file.
根据
#gstreamer
IRC 频道上的人员的说法,您无法使用 gstreamer 本身来执行此操作,您需要 gstreamer 管道之外的某些东西来循环它。According to folks on the
#gstreamer
IRC channel, you can't do this with gstreamer itself, you'd need something outside the gstreamer pipeline to loop it.它不是在 gstreamer 上的流中循环文件,但我可以使用 ffmpeg -stream_loop 选项来做到这一点。
https://ffmpeg.org/ffmpeg.html#Main-options
It's not looping file in stream on gstreamer, but I was able to do it with ffmpeg -stream_loop option.
https://ffmpeg.org/ffmpeg.html#Main-options
假设 bash...
将其包装在
while
循环中?其中
true
没有成功执行任何操作,即它允许您创建无限循环,例如
Assuming bash...
Wrap it in a
while
-loop?where
true
does nothing sucessfully, i.e.It allows you to create infinite loops, e.g.
您可以在 C++ 中使用 gstreamermm lib。请注意,这只是一个示例。
剪切视频的示例:
或者您可以使用经典的 C lib gst。
剪辑视频示例:
You can use gstreamermm lib in C++. Note it's just an example.
Example of lopping video:
Or you can use classic C lib gst.
Example of lopping video: