如何用GStreamer命令行制作倍速视频(延时摄影)并缩减时长?
实现GStreamer通过丢弃帧缩短视频时长(6倍速)
你的问题出在仅用videorate修改帧率但未调整帧的时间戳——播放器会根据帧的时间戳计算总时长,哪怕丢了帧,时间戳还是沿用原视频的,所以时长不会变。要同时实现丢弃帧、缩短时长和减小体积,需要结合时间戳调整和帧率过滤,以下是两种可行方案:
方案一:结合setpts滤镜调整时间戳+videorate丢弃冗余帧
这种方法先把视频时间轴压缩6倍(对应6倍速),再让videorate按目标帧率自动丢弃多余帧,刚好实现每6帧丢5帧的效果。假设原视频帧率为30fps,命令如下:
gst-launch-1.0 filesrc location=in.mp4 ! qtdemux name=demux demux.video_0 \ ! queue ! h264parse ! avdec_h264 ! videoconvert \ ! avfilter name=filter setpts='PTS/6' \ ! videorate ! video/x-raw,framerate=30/1 \ ! x264enc ! mp4mux ! filesink location=output.mp4
setpts='PTS/6':将每帧的时间戳除以6,直接把视频时长压缩为原有的1/6(60秒变10秒)。videorate ! video/x-raw,framerate=30/1:让滤镜只保留每秒30帧,对应每6帧丢弃5帧(原6秒180帧,压缩后1秒只留30帧)。- 如果原视频帧率不是30fps,把
framerate=30/1替换为原视频的帧率即可。
方案二:直接用videorate设置低帧率+调整时间戳
如果你明确要丢弃每6帧中的5帧,也可以直接将输出帧率设为原帧率的1/6,再配合时间戳调整确保时长正确。比如原视频30fps,输出设为5fps:
gst-launch-1.0 filesrc location=in.mp4 ! qtdemux name=demux demux.video_0 \ ! queue ! h264parse ! avdec_h264 ! videoconvert \ ! videorate ! video/x-raw,framerate=5/1 \ ! avfilter name=filter setpts='PTS/6' \ ! x264enc ! mp4mux ! filesink location=output.mp4
这种方式下,videorate会直接每6帧保留1帧,setpts确保时间轴同步压缩,最终时长为10秒,体积也会大幅减小。
验证效果
执行命令后,可以用ffprobe查看输出视频的时长和帧率:
ffprobe output.mp4
确认输出视频的时长为10秒左右,帧率符合设置值,就说明实现了预期效果。
内容的提问来源于stack exchange,提问作者Nathaniel Bubis
相关产品推荐
相关产品推荐

