Video 用gstreamer分割视频流

Video 用gstreamer分割视频流,video,gstreamer,Video,Gstreamer,有没有办法将视频分割成指定长度的片段?将60分钟的视频转换为12分钟5分钟。好的,你需要开发自己的“分段器”。这类似于创建HTTP实时流文件所需的内容。可能有一个更简单的解决方案,但我会这样做: 您可以使用multifilesink next file=buffer(或next file marker,如果内存中无法容纳段),生成一个相对较小的程序(在python中) 您需要对输入流进行编码或解复用,然后将流多路复用回来。当达到所需的持续时间时,在关键帧上剪切多路复用流,并推送聚合缓冲区(或标记

有没有办法将视频分割成指定长度的片段?将60分钟的视频转换为12分钟5分钟。

好的,你需要开发自己的“分段器”。这类似于创建HTTP实时流文件所需的内容。可能有一个更简单的解决方案,但我会这样做:

您可以使用multifilesink next file=buffer(或next file marker,如果内存中无法容纳段),生成一个相对较小的程序(在python中)


您需要对输入流进行编码或解复用,然后将流多路复用回来。当达到所需的持续时间时,在关键帧上剪切多路复用流,并推送聚合缓冲区(或标记一个伪关键帧,例如,强制接收器创建一个新文件)。重新初始化muxer(或附加muxer streamheader)以获得具有正确头的文件,而不是可以单独播放的文件(取决于muxer)。

gnonlin
gnlfilesource
就是为此而设计的。由于gstreamer不支持在不进行转码的情况下拆分某些格式,因此您必须将视频转码为该过程的一部分


有关如何从音频文件制作剪辑的示例,请参见。

我能够使用带有GStreamer和GLib绑定的Perl实现类似的功能。我的黑客滥用GStreamer管道状态来重置文件链接的位置。我使用流源,因此在设置状态(“null”)后重置为零的行为是可以接受的。您需要管理源元素中的seek位置,以支持正确的分段

my $g_pipeline = GStreamer::Pipeline->new('pipeline');
....
my $g_filesink  = GStreamer::ElementFactory->make(filesink  =>  "filesink");
$g_filesink->set(location => $file_name);
...
$g_pipeline->add(..., $g_filesink);

my $delay = 5000; # switch output file at this interval
my $timer = Glib::Timeout->add( $delay, 
  sub {
    $g_pipeline->set_state('null');
    ...
    $g_filesink->set(location=> $next_file_name);
    $g_pipeline->set_state('playing');
  }
);

FFMPEG有一个内置的段解复用器

选中文档中的-segment选项

在不重新编码和不丢失帧的情况下执行此操作的“官方”方法似乎是使用以下元素:

例如,对于MKV文件输入:

gst-launch-1.0 filesrc location=input.mkv ! matroskademux ! h264parse ! splitmuxsink location=file%02d.mkv max-size-time=300000000000 muxer=matroskamux

max size time
给出了以纳秒(sic)为单位的段长度,因此上述值为5分钟。因为它会剪切关键帧,所以实际的分段长度不会精确到5分钟,而是会变化几秒钟。

我转储了gstreamer,并使用FFMPEG库编写了分段器。必须为此编写一个丑陋的C程序;-)