我有一段30分钟长的视频。我想制作一个(比如说)15分钟长的加速版。我可以通过每隔2帧丢弃一次来做到这一点。我如何在Linux上做到这一点?我在玩GStreamer,它看起来很酷。有没有办法用GStreamer做到这一点?要做到这一点,gst-launch命令行是什么?我的源视频是运动JPEG,所以我确实有要丢弃的帧。即使它使用了关键帧,也应该有一种方法可以使电影的速度加倍?我想用命令行的方式来做这件事,因为我想让它自动化。
gst-launch
gz5pxeao1#
最近,我四处寻找了一段时间,寻找做这件事的最好方法。我尝试了mencoder-rate和libavFilter的setpt选项。我发现最好的方法是输出单独的帧,然后将这些帧重新编码成一个单独的视频。此示例假定输入视频为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
vnjpjtjt2#
只需将帧速率设置为两倍高即可。例如,如果输入真的是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视频。这不会降低图像质量。
mencoder -sstep 0.1
mplayer -nosound -channels 2 -vf decimate=-2:16384:16384:1 mvi_3524.avi
yuvfps
6uxekuva3#
我有一个视频,最初是16m06s长,帧速率为29.97,但我想加快速度(通过丢弃帧),以便它以大约16倍于正常速度的速度播放。这是我使用的命令:
ffmpeg -r:v "480/1" -i input.avi -an -r:v "12/1" output.avi
0s7z1bwu4#
avidemux可以改变胶片的帧速率,并提供command line control。
wribegjk5#
如果你有一个用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
INRATE
您可以检查框架是否与Framed5筛选器相同:
ffmpeg -i in.avi -f framemd5 in.md5 ffmpeg -i in-25fps.avi -f framemd5 in-25fps.md5
发现这些框架确实是一模一样的。
13z8s7eq6#
要通过删除帧来提高视频文件的速度,可以使用以下语法:
ffmpeg -r:v "Fin*M/1" -i input.mp4 -an -r:v "Fout/1" output.mp4
Fout
Fin
ffmpeg -i input.mp4
M
Fin * M
此示例的最终结果为:
ffmpeg -r:v "375/1" -i input.mp4 -an -r:v "30/1" output.mp4
很难从这篇帖子中提取这些信息。就我而言,这是试图澄清网络上缺失的信息。如果你认为这能很好地帮助别人,请投赞成票。
6条答案
按热度按时间gz5pxeao1#
最近,我四处寻找了一段时间,寻找做这件事的最好方法。我尝试了mencoder-rate和libavFilter的setpt选项。我发现最好的方法是输出单独的帧,然后将这些帧重新编码成一个单独的视频。此示例假定输入视频为30fps以获得最佳效果,并每隔一帧丢弃一次。
vnjpjtjt2#
只需将帧速率设置为两倍高即可。例如,如果输入真的是30/1.001 FPS:
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视频。这不会降低图像质量。
6uxekuva3#
我有一个视频,最初是16m06s长,帧速率为29.97,但我想加快速度(通过丢弃帧),以便它以大约16倍于正常速度的速度播放。这是我使用的命令:
0s7z1bwu4#
avidemux可以改变胶片的帧速率,并提供command line control。
wribegjk5#
如果你有一个用MJPEG编码的视频,你可以避免重新编码你的视频,并且有相同的帧--只是更少。我使用ffmpeg和awk的组合来实现这一点:
解释:
ffmpeg
命令从视频中提取帧awk
行擦除在以25fps的帧速率INRATE
编码视频时不需要的那些帧ffmpeg
行将剩余的帧放回一起您可以检查框架是否与Framed5筛选器相同:
发现这些框架确实是一模一样的。
13z8s7eq6#
要通过删除帧来提高视频文件的速度,可以使用以下语法:
Fout
”:这是您想要的output.mp4的FPS(每秒帧)数,例如30 FPS。Fin
”:input.mp4的FPS个数,例如25 FPS。您可以通过以下命令找到答案:ffmpeg -i input.mp4
M
”:乘数,您想要的速度系数,例如15表示视频速度快15倍。Fin * M
”:在本例中,即为25*15=375此示例的最终结果为:
很难从这篇帖子中提取这些信息。就我而言,这是试图澄清网络上缺失的信息。如果你认为这能很好地帮助别人,请投赞成票。