参考

How to cut at exact frames using ffmpeg?

概述

目前来说,视频截取主要是根据时间来截取,如果要以帧数来截取的话,也要换算成时间。
比如从133帧开始截取,帧率是25的话,那换算成时间就是 133/25 = 5.32秒。

相关参数介绍

-ss: 代表待截取视频的开始时间
-t: 代表截取视频的时长
-to: 代表截取视频的结束时间

-ss 1.0 -t 5: 代表从第1秒开始,截取5秒的视频片段
-ss 1.0 -to 5.0: 代表截取从第1秒,截取到第5秒

此处有坑! -ss 1.0 -to 5.0

-ss 1.0 -i xxx.mp4: 叫做input seeking
-i xxx.mp4 -ss 1.0: 叫做output seeking

在使用input seeking的时候,配置-ss和-to截取视频,会出现很大的误差,后半段基本截取失败。
就是这个命令: -ss 1.0 -i xxx.mp4 -to 5.0
此时,需要改为output seeking,就可以解决问题:

参考资料:https://ottverse.com/trim-cut-video-using-start-endtime-reencoding-ffmpeg/

截取:从第n秒开始

-ss参数: 告诉ffmpeg从哪个时间开始

下面是真正的截取命令

  1. ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

注意事项
在截取的时候,需要重新进行h264编码,否则截取的视频会有问题。
主要原因是截取的时候,视频中不是每一帧都是关键帧,随机截取的话,很容易出现问题,所以需要重新编码。

之前试过下面的截取命令:

  1. ffmpeg -i 111.mp4 -ss 0.75 -vcodec copy -acodec copy 222.mp4

该命令存在很大问题,明明只需要截取0.75秒,结果将视频截掉了5秒多。