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

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

我有一个30分钟长的视频。我想做一个(比如说)15 分钟长的加速版本。我可以通过丢弃每第二帧来做到这一点。我怎样才能在Linux上做到这一点?

我正在玩gstreamer,它看起来很酷。有没有办法用 gstreamer 做到这一点?执行此操作的

gst-launch
命令行是什么?

我的源视频采用 Motion JPEG 格式,因此确实有丢帧的情况。即使使用关键帧,仍然应该有办法“加倍速度”影片吗?

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

linux video encoding gstreamer
6个回答
8
投票

要通过删除帧来加速视频文件,可以使用以下语法:

ffmpeg -r:v "Fin*M/1" -i input.mp4 -an -r:v "Fout/1" output.mp4
  • Fout
    ”:这个无非就是FPS(Frames 每秒)您想要的output.mp4,例如30 FPS。
  • Fin
    ”:input.mp4的FPS数,例如25FPS。你可以 找到这个:
    ffmpeg -i input.mp4
  • M
    ”:乘数,您想要的速度系数,例如15 制作视频 快 15 倍。
  • Fin * M
    ”:因此在本例中,即 25 * 15 = 375

本例最终结果为:

ffmpeg -r:v "375/1" -i input.mp4 -an -r:v "30/1" output.mp4

5
投票

我有一个视频最初长 16 分 6 秒,帧率为 29.97,但我想加快速度(通过丢帧),使其以正常速度的 16 倍左右播放。这是我使用的命令:

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

5
投票

我最近环顾了一段时间,寻找做到这一点的最佳方法。我尝试了 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

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 有一个

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

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


1
投票

avidemux可以更改电影的帧速率并提供命令行控制


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

发现框架确实是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.