Video 用gstreamer分割视频流
有没有办法将视频分割成指定长度的片段?将60分钟的视频转换为12分钟5分钟。好的,你需要开发自己的“分段器”。这类似于创建HTTP实时流文件所需的内容。可能有一个更简单的解决方案,但我会这样做: 您可以使用multifilesink next file=buffer(或next file marker,如果内存中无法容纳段),生成一个相对较小的程序(在python中)Video 用gstreamer分割视频流,video,gstreamer,Video,Gstreamer,有没有办法将视频分割成指定长度的片段?将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程序;-)