我想要拍摄一段 1 分钟长的视频,并加快速度,使其只有 10 秒长 (x6)。我不想只更改显示速率,我想在本例中实际删除 6 帧中的 5 帧,以减小视频的大小和长度。
如何使用 gstreamer 命令行实现此目的?
我尝试过使用
videorate
过滤器:
gst-launch-1.0 filesrc location=in.mp4 ! qtdemux name=demux demux.video_0 \
! queue ! h264parse ! avdec_h264 ! videoconvert ! videorate
! video/x-raw,framerate=180/1 ! x264enc ! mp4mux ! filesink location=output.mp4
但是无论我传递什么参数,虽然丢帧,但视频的长度保持不变。
我不确定使用 gst-launch 的单个命令是否可以实现这一目标。如果可能的话,更熟练的人可能会展示如何操作。
离线处理肯定是可行的。如果您的视频持续时间较长,这可能不太方便。最好保存在外部磁盘上,这样您就不会填满系统文件。
您可以将 mp4 视频解码为视频帧,将每个帧编码为 jpg 并使用 multifilesink 存储到文件:
mkdir tmpDir && cd tmpDir
# Beforehand I created a sample video with:
# gst-launch-1.0 videotestsrc pattern=ball num-buffers=600 ! videoconvert ! video/x-raw,format=NV12 ! x264enc ! h264parse ! qtmux ! filesink location=test_h264.mp4
# Clean up previous video images
rm -f *.jpg
# Decode and convert frames into JPG
gst-launch-1.0 filesrc location=test_h264.mp4 ! qtdemux ! h264parse ! avdec_h264 ! jpegenc ! multifilesink location=test_%05d.jpg -ev |& grep GstMultiFileSink
完成后,在“caps=”之后复制上述命令输出中的大写字母,例如
image/jpeg, sof-marker=(int)0, width=(int)320, height=(int)240, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1, interlace-mode=(string)progressive, colorimetry=(string)bt601
然后通过重播这组图片来创建延时摄影,使用复制的大写并编辑帧速率,然后重新编码并放入 mp4 容器中:
gst-launch-1.0 multifilesrc location=test_%05d.jpg ! 'image/jpeg, sof-marker=(int)0, width=(int)320, height=(int)240, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)180/1, interlace-mode=(string)progressive, colorimetry=(string)bt601' ! jpegdec ! videoconvert ! x264enc ! h264parse ! qtmux ! filesink location=testOut.mp4
# Check video details
gst-discoverer-1.0 -v testOut.mp4
# Play it
gst-play-1.0 testOut.mp4