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
它启动并等待传入流。
在另一个终端上运行播放管道:
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”)。当没有通配符指向下一个文件时,它会循环回唯一的已知文件。