我正在尝试放慢960fps
在Android手机上录制的视频的速度。我发现很多以前的帖子和博客基本上都说同样的事情,你需要改变“演示时间戳”(pts)。我还发现official documentation正在说同样的事情。命令行基本上如下所示:
ffmpeg -i input.mp4 -filter:v "setpts=4*PTS" -r 30 -y output.mp4
我使用Android Filter Transfer复制了视频文件,当我使用上面的命令行时,它可以减慢速度,但结果输出不稳定。 ffmpeg
的输出也表示它正在复制帧:
frame= 687 fps=103 q=-1.0 Lsize= 4454kB time=00:00:22.80 bitrate=1600.1kbits/s dup=515 drop=0 speed=3.42x
在文件上运行ffprobe
会显示:
ffprobe version 3.1.1 Copyright (c) 2007-2016 the FFmpeg developers
built with Apple LLVM version 7.3.0 (clang-703.0.31)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.1.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-lda
libavutil 55. 28.100 / 55. 28.100
libavcodec 57. 48.101 / 57. 48.101
libavformat 57. 41.100 / 57. 41.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 47.100 / 6. 47.100
libavresample 3. 0. 0 / 3. 0. 0
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
libpostproc 54. 0.100 / 54. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'VID_20161030_213810.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2016-10-30 16:08:14
location : +17.3874+078.3395/
location-eng : +17.3874+078.3395/
com.android.version: 6.0.1
com.android.capture.fps: 120.000000
Duration: 00:00:05.73, start: 0.000000, bitrate: 14991 kb/s
Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1280x720, 13859 kb/s, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 90k tbn, 180k tbc (default)
Metadata:
creation_time : 2016-10-30 16:08:14
handler_name : VideoHandle
这似乎检测到视频是30 fps
而不是960 fps
,这可能是为什么它会填充重复的帧而不是使用现有的帧。
我在Lenovo Z2 Plus(AKA Zuk Z2)上录制视频。如果我使用内置播放器以慢速播放视频,它看起来非常流畅,所以帧肯定存在。有人能帮我弄清楚正确的方法吗?该文件可用here(约10MB),以防有人想尝试。
更新:用另一部手机录制的手机上的慢动作视频播放。请注意,如果原始视频为30fps,则无法平滑和缓慢地抛出火花,这是不可能的。