如何通过丢帧来加速视频?

时间:2009-08-26 14:09:47

标签: linux video encoding gstreamer

我有一段30分钟的视频。我想制作一个加速版本(比方说)15分钟。我可以通过丢弃每第2帧来做到这一点。我怎么能在linux上做到这一点?

我正在玩gstreamer,看起来很酷。有没有办法用gstreamer做到这一点?执行此操作的gst-launch命令行是什么?

我的源视频是Motion JPEG,所以我确实要删除帧。即使它使用关键帧,仍然应该有一种方法来“加倍”电影?

我想要一个命令行方式来执行此操作,因为我想自动化它。

5 个答案:

答案 0 :(得分:4)

您可以将帧速率设置为两倍高。例如如果输入真的是30 / 1.001 FPS:

mencoder -fps 60/1.001 -oac copy -ovc copy -o output.avi input.avi

http://www.mplayerhq.hu/DOCS/HTML/en/index.html

或删除mencoder -sstep 0.1的帧以在每帧后0.1秒向前跳过。

mplayer -nosound -channels 2 -vf decimate=-2:16384:16384:1 mvi_3524.avi也有效,但它可能很慢,如果不解压缩/重新压缩每一帧,你可能无法做到。

mjpegtools在y4m视频中有一个yuvfps用于混合/删除帧。请参阅http://linux.die.net/man/1/mjpegtools

我没有太多运气找到一个知道如何在没有解压缩/重新压缩的情况下从mjpeg视频中删除帧的工具。因此,您可能必须将mjpeg转换为.jpg文件的目录,删除奇数编号的目录,然后将它们重新组合成具有相同帧速率的mjpeg视频。这不会降低图像质量。

答案 1 :(得分:4)

我最近在最好的方式上环顾了一会儿。我尝试使用mencoder -speed和libavfilter的setpts选项。我发现的最好方法是输出单个帧,然后将这些帧重新编码为单个视频。此示例假设输入视频为30fps,以获得最佳效果,并且每隔一帧丢弃一次。

# Output the video at 15fps as jpegs
ffmpeg -i input.m4v -r 15 -f image2 /tmp/output-%06d.jpg
# Re-encode the frames at 30fps as h264
ffmpeg -r 30 -i "/tmp/output-%06d.jpg" -vcodec libx264 -threads 0 -an output.m4v

答案 2 :(得分:1)

avidemux可以更改电影的帧率并提供command line control

答案 3 :(得分:1)

我有一段最初16m06s的视频,帧率为29.97,但我想加快速度(通过丢帧),以便以正常速度的16倍播放。这是我使用的命令:

ffmpeg -r:v "480/1" -i input.avi -an -r:v "12/1" output.avi

答案 4 :(得分:0)

如果你有一个用mjpeg编码的视频,你可以避免重新编码你的视频并拥有相同的帧 - 只有更少。我使用ffmpeg和awk的组合来实现这个目标:

#!/bin/bash
INMOVIE=${1}
INRATE=${2}
OUTMOVIE="${INMOVIE%.avi}-25fps.avi"

ffmpeg -i ${INMOVIE} -c:v copy .frame_%08d.jpg
rm $(ls .frame_*.jpg |  awk " BEGIN { c=0.0; fd=1./${INRATE}; fr=25.; last=-1 } { current=int(NR * fr * fd); if (current > last) {last = current;} else { print \$0;} }" )
ffmpeg -pattern_type glob -i '.frame_*.jpg' -c:v copy ${OUTMOVIE}
rm -- .frame_*.jpg

说明:

  • 第一个ffmpeg命令从视频中提取帧
  • 下面的awk行会删除以25fps的帧率INRATE编码视频时不需要的帧
  • 最后ffmpeg行将剩余的帧重新组合在一起

您可以检查帧是否与framemd5过滤器相同:

ffmpeg -i in.avi -f framemd5 in.md5
ffmpeg -i in-25fps.avi -f framemd5 in-25fps.md5

并发现帧确实相同。