二、Gstreamer splitmuxsink

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

该元素包装muxer和sink,并在mux内容即将跨越最大尺寸的最大时间阈值时启动一个新文件,在视频关键帧边界分割。只有一个输入视频流可以与任意多的音频和字幕流混接。

默认情况下,它使用mp4mux和filesink,但可以通过muxersink属性更改它们。

最小文件大小是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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值