我知道之前有人问过,但我找不到快速准确的解决方案,我想修剪最长15秒的视频。以下是我到目前为止所尝试的内容,我正在使用此视频作为示例:http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_30mb.mp4
最快的方式
这是迄今为止最快的方式,因为它不需要对视频进行重新编码,但在此视频中非常真实,因为关键帧是每5-10秒:
ffmpeg -i SampleVideo_1280x720_30mb.mp4 -ss 30 -to 50 -c copy -y out.mp4
以下是我检查此视频中关键帧的方法:
ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv SampleVideo_1280x720_30mb.mp4 | grep -n I | cut -d ':' -f 1
通过这个命令,我发现它在第211帧中的第二个关键帧,这意味着第一个关键帧和第二个关键帧之间有210帧,知道它是一个25fps的视频,它在关键帧之间大概是8秒,所以在1-8秒之间的任何切换将落入其中一个帧中,这对于15秒的视频来说是一个巨大的差异。
准确的方法
这种方式很准确但需要重新编码视频:
ffmpeg -i SampleVideo_1280x720_30mb.mp4 -ss 30 -to 50 -preset ultrafast -y out.mp4
问题是这个命令需要20多秒才能完成使用超快预设,在三星Galaxy s6边缘加上其他设备可能更多。
然而,如果我在Instagram中打开SampleVideo_1280x720_30mb.mp4并修剪它,它们会在不到2秒的时间内获得精确的修剪。
我还试图每秒强制关键帧,但它还需要重新编码视频,它会影响视频质量:
ffmpeg -i SampleVideo_1280x720_30mb.mp4 -force_key_frames "expr:gte(t,n_forced*1)" out.mp4
有人知道Instagram如何修剪视频或使用FFMpeg进行快速准确的修剪?
答案 0 :(得分:1)
我弄清楚Instagram做了什么,基本上没有办法更快地修剪视频。因此,为了向用户显示预览,我执行了以下操作:
当用户移动拇指以设置新的剪切位置时,我会截取视频播放器显示的当前图像的屏幕截图。
使用微调器将ImageView放在与其顶部相同的视频大小上,因此视频播放器不再可见。
将视频播放器静音,并在用户所需位置前寻找最近的关键帧。
从关键帧开始播放视频,并计算从关键帧到所需位置的时间。
隐藏ImageView并取消静音视频。
所以在我用作视频的视频中,第一个关键帧位于第二个0,第二个关键帧位于第二个关键帧8。让我们说用户想要在第二个关键帧中进行切换,然后我寻求到第二个0的关键帧并等待3秒,然后取消静音并显示视频。这样,用户只需等待3秒才能看到预览。
当用户接受预览时,将在后台进程中进行实际修剪。