裁剪是任何视频编辑应用的核心功能。虽然从零开始实现这一功能可能既复杂又耗时,但借助 FFmpeg,你只需几行代码即可轻松完成。在这篇教程中,简鹿办公将详细介绍 FFmpeg 命令行具体操作方法。
FFmpeg 是一个功能强大且持续活跃开发的跨平台命令行工具,可用于处理音视频文件。要下载最新版本的 FFmpeg,请访问其官方网站,网站提供适用于 Linux、Windows 和 macOS 的预编译二进制文件。
另一种安装方式是使用包管理器,例如 macOS 上的 Homebrew 或 Linux 上的 APT。以下是在 macOS 上通过 Homebrew 安装 FFmpeg 的方法:
brew install ffmpeg
现代视频压缩格式(如 H.264(高级视频编码,AVC)和 H.265(高效视频编码,HEVC))采用帧间预测压缩技术。这意味着它们不仅压缩单个帧,还会通过分析相邻帧之间的相似性,仅存储解码当前帧所需的增量数据,从而进一步减小文件体积。
I 帧(Intra-frame,也称关键帧):仅使用帧内压缩,不依赖其他帧。
P 帧(Predictive frame):依赖前向参考帧(之前的 I 帧或 P 帧)。
B 帧(Bidirectional frame):可同时利用前向和后向参考帧(即前后帧的数据)。
由于 P 帧和 B 帧依赖邻近帧的数据,其体积比 I 帧更小,但解码时间更长 —— 因为解码器必须先找到最近的 I 帧,然后按顺序解码中间所有的 P 帧或 B 帧,才能还原目标帧。
需要特别注意的是:普通视频文件中的绝大多数帧都是 P 帧或 B 帧。虽然技术上可以将视频全部编码为 I 帧(称为“全 I 帧”模式),但这会导致文件体积急剧膨胀,因此极少使用。
你可以使用 FFmpeg 开发者提供的另一个工具 ffprobe 来查看视频中的帧类型:
ffprobe -select_streams v -show_frames -show_entries frame=pict_type -of csv video.mp4
使用 FFmpeg 裁剪视频时,主要用到以下参数:
-ss(seek time specifier):指定裁剪的起始时间。
-t(duration):指定裁剪片段的持续时长。
-to(end time):指定裁剪的结束时间。
这些参数的值支持两种格式:
时:分:秒.毫秒(如 -ss 01:10:34.000)
纯秒数(如 -ss 130.5)
示例 1:快速裁剪(不重新编码)
ffmpeg -i input.mp4 -ss 12 -to 50 -c copy trimmed.mp4
该命令将从 input.mp4 中裁剪出 第 12 秒至第 50 秒 的片段,并保存为 trimmed.mp4。由于使用了 -c copy 参数,视频和音频流不会被重新编码,因此速度极快。
缺点:若起始时间点(12 秒)处没有 I 帧,裁剪后的视频开头可能会出现黑屏、首帧冻结,或实际起始时间晚于指定时间 —— 因为 FFmpeg 会从下一个最近的 I 帧开始写入。
示例 2:精确裁剪(重新编码)
ffmpeg -i input.mp4 -ss 00:00:12 -t 00:00:10 trimmed.mp4
此命令将从第 12 秒开始,精确提取 10 秒 的视频片段,并使用默认编码参数重新生成 trimmed.mp4。虽然速度较慢,但能确保起始时间精准。
提示:FFmpeg 支持丰富的编码参数。如需优化画质或文件大小,请参考官方 H.264 和 H.265 编码指南。
得益于 FFmpeg 的开源特性,它可被移植到官方未直接支持的平台。iOS 上一个流行的 FFmpeg 封装库是 FFmpegKit。
在 iOS 应用中使用 FFmpeg 时,你需要:
自行设计用户界面;
获取用户输入(如裁剪时间范围);
组装类似上述示例的 FFmpeg 命令并调用;
自行实现视频播放功能(FFmpeg 本身不提供播放器,需借助 AVPlayer、MediaPlayer 或第三方框架)。
目前简鹿视频格式转换器部分视频转换功能也是基于 FFmpeg 进行开发的工具,它也提供了视频格式转换、音频格式转换等功能。软件提供了 Windows 和 Mac 系统,如果你想体验也可以下载使用。