假设我有一个名为Concert.mp4的视频。我想以最少的重新编码快速从中提取性能。我想这样做,但速度更快:
ffmpeg -i "Concert.mp4" -ss 00:11:45 -to 00:18:15 -preset veryfast -y artist.mp4
这需要17秒,对于我们的需求来说太长了。
现在,事实证明11:45和18:15不会落在iframe上,因此,如果您尝试这样做,则会在视频播放开始时出现3秒钟的延迟:
ffmpeg -i "Concert.mp4" -ss 00:11:45 -to 00:18:15 -c copy -y artist.mp4
运行此命令,我们可以看到需要切割的地方:
ffprobe -read_intervals "11:00%19:00" -v error -skip_frame nokey -show_entries frame=pkt_pts_time -select_streams v -of csv=p=0 "Concert.mp4" > frames.txt
因此,我们需要对前3.708秒进行编码,复制中间的内容,然后对后5.912秒进行编码。
我可以使这3个片段看起来完全完美(单独):
ffmpeg -ss 698.698 -i "Concert.mp4" -ss 6.302 -t 3.708 -c:v libx264 -c:a copy -c:s copy -y clipbegin.mp4
ffmpeg -ss 708.708 -to 1089.088 -i "Concert.mp4" -c copy -y clipmiddle.mp4
ffmpeg -ss 1089.088 -i "Concert.mp4" -t 5.912 -c:v libx264 -c:a copy -c:s copy -y clipend.mp4
ffmpeg -f concat -i segments.txt -c copy -y artist.mp4
segments.txt当然包含以下内容:
file 'clipbegin.mkv'
file 'clipmiddle.mkv'
file 'clipend.mkv'
我在这里看到了此解决方案,但是没有任何调整使其对我有用:
https://superuser.com/a/1039134/73272
据我所知,这种方法根本不起作用。无论我尝试什么,都会使VLC崩溃。
3秒后,合并的视频继续出现故障,可能是因为PTS时间不同或有所不同(使用某些选项,我已经看到了有关此效果的警告消息)。我可以在上述命令中添加任何内容以使其正常工作吗?唯一的要求是,中间命令不得重新编码视频,而必须进行快速复制。
谢谢。
答案 0 :(得分:0)
好的,所以答案只是最新的VLC似乎有问题。我在上方所做的操作在ffplay
,mplayer
和PotPlayer
的切入点处稍有停顿就可以了。
按照@Gyan的建议,我将配置文件和级别设置为与原始匹配(使用-profile:v main -level:v 4
),甚至略微停顿也消失了。
ffmpeg -ss 698.698 -i "Concert.mp4" -ss 6.302 -t 3.708 -c:v libx264 -c:a copy -c:s copy -profile:v main -level:v 4 -y clipbegin.mp4
ffmpeg -ss 708.708 -to 1089.088 -i "Concert.mp4" -c copy -y clipmiddle.mp4
ffmpeg -ss 1089.088 -i "Concert.mp4" -t 5.912 -c:v libx264 -c:a copy -c:s copy -profile:v main -level:v 4 -y clipend.mp4
ffmpeg -f concat -i segments.txt -c copy -y artist.mp4