FFmpeg 是一个非常强大的多媒体编解码器,本文记录一下使用和学习过程中的一些基本操作和笔记,文末整理了俺保存的一些学习资源。
§00. 安装
§Linux 系统(以 Debian 12 为例)
首先不建议使用系统的包管理器直接安装,比如 sudo apt install -y ffmpeg, 这样安装的 FFmpeg 版本一般都很古早,遇到现代一点的编码格式比如 av1 vp9 这种很容易报错(如果你是 高贵的 Arch 系发行版用户当俺没说……),建议是手动安装预编译好的最新版本:
| |
不出意外的话应该能看到输出了最新的版本号。如果之前已经通过包管理器安装了 FFmpeg,导致此时输出的版本号还是旧的,直接卸载旧的就行:
| |
后续如果要更新 FFmpeg 版本,将上面下载预编译文件的链接替换为最新的即可。
§Windows 系统
这部分内容参考 在线视频下载神器 You-Get 的安装及使用 | HE-SB-技术栈 的【安装 ffmpeg】部分即可,不再赘述。
§01. 合并多个视频文件
| |
选项释义:
-f concat: 指定输入格式为concat,即告诉 FFmpeg 程序,后面的list.txt不是视频文件,而是一个列表文件,需要按照这个文件来连续读取多个视频文件。-safe 0: 权限设置。默认情况下,为了安全,FFmpeg 不允许读取包含相对路径或特殊字符的文件。设置为0表示允许读取任意路径的文件。-i 'list.txt': 输入文件。这里的输入不是一个视频文件,而是一个包含视频文件路径列表的文本文件。-c copy: 流拷贝模式。直接将视频/音频流从原文件拷贝到目标文件,不进行重新编码。速度极快(只取决于磁盘 I/O 速度)且质量无损。'full.flv': 输出文件。合并后的最终文件名。
其中,list.txt 文件的内容格式是每行以 file 开头,后面是文件路径(如果只有文件名,没有路径,那么就只会在当前路径查找,没有就会报错),内容类似这样:
| |
这种方式合并视频,速度非常快(因为没有重新编解码),但是有严格的前提,就是 list.txt 内的所有待合并的视频文件,编码参数必须一致,包括分辨率、帧率、编码格式和音频参数等。如果不一致,合并后的视频文件会有问题(画面卡顿或无法播放),此时只能去掉 -c copy 参数,重新编码。
§02. 分割视频
| |
选项释义:
-i 'full.flv': 指定输入源文件。-t 06:00:00: 限制输出的时长。这里表示截取从00:00:00到06:00:00的内容。-c copy: 流拷贝模式。-map 0: 强制映射输入文件(索引号为 0)中的所有流(包括所有视频轨、音频轨、字幕轨等)到输出文件。'1.flv': 第一个输出文件的文件名。-ss 06:00:00: 设定第二个文件的起始时间点。这里表示从06:00:00的位置开始。'2.flv': 第二个输出文件的文件名。
注意到其中 -c copy 和 -map 0 出现了两次,因为这两个参数都是作用于输出文件的,这里有两个输出文件,对每个输出都要指定一次。
FFmpeg 在执行这条命令时,会打开一次 full.flv,然后开启两个写进程:
- 第一个进程从
full.flv开头复制到06:00:00处停止。 - 第二个进程从
06:00:00复制到文件结束。
§03. 转换封装格式
| |
这个命令可以无损地将 flv 格式的视频转换为 ts 格式,注意只转换了封装格式,并没有重新编码。
参考链接: