该元素包装muxer和sink,并在mux内容即将跨越最大尺寸的最大时间阈值时启动一个新文件,在视频关键帧边界分割。只有一个输入视频流可以与任意多的音频和字幕流混接。
默认情况下,它使用mp4mux和filesink,但可以通过muxer和sink属性更改它们。
最小文件大小是1 GOP,但是,如果任意两个关键帧之间的距离大于限制,则限制可能会超过。
如果视频流可用,则分割过程由视频流内容驱动,视频流必须包含关闭的GOPs,以便输出文件的部分能够正确地单独播放。在没有视频流的情况下,第一个可用的流用作同步的参考。
在async-finalize模式下,当超过阈值时,旧的muxer和sink从管道断开连接,然后离开以异步方式完成文件,并创建一个新的muxer和sink来继续处理下一个片段。因此,使用muxer-factory和sink-factory属性以及muxer-properties和sink-properties来构造新对象,而不是使用muxer和sink对象。
Example pipelines
从测试源捕获的视频流,并将其融合到ISO mp4文件中,根据需要分割以限制大小/持续时间为10秒和1MB的最大大小。
gst-launch-1.0 -e videotestsrc ! video/x-raw,width=320,height=240 ! videoconvert ! queue ! timeoverlay ! x264enc key-int-max=10 ! h264parse ! splitmuxsink location=video%02d.mov max-size-time=10000000000 max-size-bytes=1000000
记录从v4l2设备捕获的视频流,并将其绑定到可流的Matroska文件中,根据需要分割以限制大小/持续时间为10秒。每个文件都将异步完成。
gst-launch-1.0 -e v4l2src num-buffers=500 ! video/x-raw,width=320,height=240 ! videoconvert ! queue ! timeoverlay ! x264enc key-int-max=10 ! h264parse ! splitmuxsink location=video%02d.mkv max-size-time=10000000000 muxer-factory=matroskamux muxer-properties=“properties,streamable=true”
记录10帧到mp4文件,使用muxer-pad-map在splitmuxsink sink pad和它将交付到的相应muxer pad之间进行显式映射。
gst-launch-1.0 videotestsrc num-buffers=10 ! jpegenc ! .video splitmuxsink muxer=qtmux muxer-pad-map=x-pad-map,video=video_1 location=test%05d.mp4 -v
信号
format-location
/**
* fragment_id 是片段ID,比如设定了最大文件数,这个ID就会这[0,max_num_files]循环
*/
gchararray
format_location_callback (GstElement * splitmux,
guint fragment_id,
gpointer udata)
返回值:下一个输出文件使用的位置。这必须是一个新分配的字符串,当splitmuxsink元素不再需要它时,它将用g_free释放,所以使用g_strdup或g_strdup_printf或类似的函数来分配它。
format_location_full
/* 多了GstSample,这里面包含了第一个Buffer */
gchararray
format_location_full_callback (GstElement * splitmux,
guint fragment_id,
GstSample * first_sample,
gpointer udata)
#include<gst/gst.h>
const int FILES_NUMBER = 12;
typedef struct _CustomData {
GstElement *pipeline;
GstElement *source;
GstElement *h264_depay;
GstElement *queue;
GstElement *h264_parse;
GstElement *splitmuxsink;
GMainLoop *loop;
} CustomData;
static const char *rtsp_url = "rtsp://admin:yangquan123@192.168.10.7:554/Streaming/Channels/101";
static const char *filename = "cam02";
static guint64 max_size_time = 60 *GST_SECOND;
// Handler for the pad-added signal
static void pad_added_handler (GstElement *src, GstPad *pad, CustomData *data);
//handler for formatting properly the file saved
static gchar* formatted_file_saving_handler(GstChildProxy *splitmux, guint fragment_id);
// gpointer is a void
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data);
int main(int argc, char **argv){
GOptionContext *context;
GError *error = NULL;
CustomData data;
GstBus *bus;
GstStateChangeReturn ret;
char **filenames = g_new0 (char *, FILES_NUMBER);
for (int i = 0; i < FILES_NUMBER; i++) {
filenames[i] = g_new0 (gchar, 30);
}
// Initialize GStreamer
gst_init (&argc, &argv);
// Create the elements
data.source = gst_element_factory_make ("rtspsrc", "source");
data.h264_depay = gst_element_factory_make("rtph264depay", "depay");
data.queue = gst_element_factory_make("queue", "queue");
data.h264_parse = gst_element_factory_make

splitmuxsink是一个GStreamer组件,用于在达到最大文件大小或时间阈值时分割视频流到多个文件,通常用于限制文件大小或持续时间。它支持根据视频关键帧边界分割,并能处理多个音频和字幕流。示例pipeline展示了如何使用splitmuxsink进行文件分割,例如从RTSP源捕获视频并保存为MP4片段。当出现错误时,程序会尝试重置pipeline并恢复播放。
最低0.47元/天 解锁文章
1129

被折叠的 条评论
为什么被折叠?



