如何使用 gstreamer 加速视频(制作延时)?

问题描述 投票:0回答:1

我想要拍摄一段 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

但是无论我传递什么参数,虽然丢帧,但视频的长度保持不变。

video video-streaming gstreamer video-processing
1个回答
0
投票

我不确定使用 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
© www.soinside.com 2019 - 2024. All rights reserved.