本文旨在通过介绍常见的ffmpeg命令行用法,帮助读者迅速掌握ffmpeg对音视频文件的操作。同时,我们将简要探讨音视频的基础原理,相信通过对音视频编解码的理解,读者将更加轻松地理解和记忆ffmpeg的命令操作。
FFmpeg 是一个开源的多媒体处理工具,以其强大的功能和广泛的格式支持而闻名。通过使用FFmpeg的命令行工具,用户可以进行音视频文件的转码、剪辑、合并等操作。其灵活性使其成为处理各种多媒体任务的理想选择。作为开源项目,FFmpeg免费提供给用户,并在不同平台上广泛应用。
安装使用: 只需要下载 FFmpeg 的压缩包,解压后将 bin 目录添加到环境变量即可。
- 下载,随便下载一个稳定版本即可。

- 将下载好的压缩包解压,并将对应的
bin目录加入到系统环境变量中即可。


然后检查一下是否配置成功,在命令行窗口输入ffmpeg -version看看是不是正常。

初体验,例如将2s的视频剪切成1s。
// 从1s处开始裁剪
ffmpeg -ss 00:00:01 -i input.mp4 -t 00:00:03 -c:v copy -c:a copy excerpt.mp4

音视频基础原理
首先简单介绍一下音视频基础原理,一个视频文件其实就是视频流和音频流结合,随着影音摄像技术的不断发展,现在视频的分辨率越来越高,2k、4k依然成为很多人的选择,最低接受的程度想必也是1080P,那么有没有想过如果没有视频编码压缩,一个视频文件的文件大小能有多大呢?
举个例子,一个未经压缩的AVI格式的视频以每秒25帧播放,每帧画面为1024×768像素、24位彩色,且的1秒钟视频(不考虑声音占用大小),那么需要多少存储空间?计算方式:1024×768×3×25×1等于56.25MB,因此1s的720P视频原生需要的空间就有56.25M,一块硬盘存储的数据量极其有限,因此引入压缩算法就十分重要。
其中视频流有着自己的编码格式,常见的有h264、h265和mpeg-2等,音频也有独立的编码格式:mp3、aac等,这个过程就是音视频数据的压缩和编码,当有了音频流和视频流以后就需要把它们同步,封装到容器里,常见的容器格式有mp4、flv、wmv和mov等,这个过程就是视频封装。
FFmpeg处理音视频的流程

- 输入文件: 封装视频文件
- demuxer:解封装,获取压缩编码后的数据
- 编码数据包:压缩编码后的数据
- decoder:数据解码,恢复成原始数据
相信有了一定的编码原理了解,理解上面ffmpeg对音视频的处理流程不是难事,这个流程非常重要,因为除了ffmpeg的基本信息查询命令外,其它命令都按这个流程处理音视频。
梳理一下上图的流程:首先需要将编码的数据包传送给解码器。 解码器产生未压缩的帧(原始视频/ PCM音频/ …),可以通过滤波进一步处理。 在过滤之后,帧被传递到编码器,编码器并输出编码的数据包。 最后,这些传递给复用器,将编码的数据包写入输出文件。
FFmpeg的帮助信息和命令格式
基本信息查询
FFMPEG 可以使用下面的参数进行基本信息查询。例如,想查询一下现在使用的 FFMPEG 都支持哪些 filter,就可以用 ffmpeg -filters 来查询。详细参数说明如下:
- -version显示版本。
- -formats 显示可用的格式(包括设备)。
- -demuxers 显示可用的demuxers。
- -muxers 显示可用的muxers。
- -devices 显示可用的设备。
- -codecs 显示libavcodec已知的所有编解码器。
- -decoders 显示可用的解码器。
- -encoders 显示所有可用的编码器。
接下来介绍的是 FFMPEG 处理音视频时使用的命令格式与参数。
命令基本格式及参数
下面是 FFMPEG 的基本命令格式:
ffmpeg [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...
常用的命令行参数:
-c:指定编码器
-c copy:直接复制,不经过重新编码(这样比较快)
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。
主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
视频参数:
-b 设定视频流量,默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
FFmpeg的常用命令
学习了大致的信息获取和命令格式,下面直接进入实战
不重新编码就能转换容器格式
可能你正在使用的某个应用只支持MOV容器格式,而你的源文件的容器格式为MP4。你可以使用Adobe Premiere Pro完成上述格式转换,但是Premiere Pro在转换时一定会重新编码,因此很耗时。而使用下面这条FFmpeg命令可以改变容器格式却不需要重新编码:
ffmpeg -i input.mp4 -c:v copy -c:a copy output.mov
命令解释:
-c:v copy指定视频的编码译码器为copy,这告诉FFmpeg直接把压缩后的视频流复制到新的文件而不重新编码。-c:a copy指定音频的编码译码器为copy,这告诉FFmpeg直接把压缩后的音频流复制到新的文件而不重新编码。
转换.ts文件的容器格式
对于.ts扩展名的MPEG-2容器格式的文件,你需要增加一项命令在传输流文件中处理MPEG-2/4 ADTS头:
ffmpeg -i input.ts -bsf:a aac_adtstoasc -c:v copy -c:a copy outputfromts.mp4
命令解释:
-bsf:a aac_adtstoasc处理ADTS转换。较新版本的FFmpeg会自动增加这条命令。
不重新编码就能裁剪视频
你可能需要裁剪视频中的部分内容,使用Adobe Premiere Pro来裁剪视频需要渲染以及编码,因此很耗时。而使用下面这条FFmpeg命令可以快速裁剪视频:
ffmpeg -ss 00:00:05 -i input.mp4 -t 00:00:03 -c:v copy -c:a copy excerpt.mp4
命令解释:
-ss 00:00:05从视频第5秒开始裁剪。-t 00:00:05裁剪的视频时长为5秒,如果你不设置这项命令,视频会从-ss设置的开始时间一直裁剪到视频末尾。
当编码译码器设为copy时,FFmpeg会根据关键帧进行查找,因此设置的时间不会完全精准,在多数应用场景下这不会有问题,但是如果你需要精准的时间设置,你可能需要其他视频编辑器。
不重新编码就能裁剪视频
可以使用FFmpeg来裁剪视频,而无需重新编码整个视频文件。下面是一个示例命令:
ffmpeg -ss 00:00:05 -i input.mp4 -t 00:00:03 -c:v copy -c:a copy excerpt.mp4
命令解释:
-ss 00:00:05:从视频的第5秒开始裁剪。-t 00:00:03:裁剪的视频时长为3秒。如果不设置该选项,视频将从-ss设置的开始时间一直裁剪到视频的末尾。-c:v copy和-c:a copy:这些选项指定了视频和音频流的编码器为“copy”,表示直接复制原始流,而不进行重新编码。
请注意,由于FFmpeg根据关键帧进行查找,所以设置的时间可能不会完全精确。在大多数情况下,这不会有问题,但如果你需要精确的时间设置,可能需要使用其他视频编辑工具。
转码和调整分辨率
要转码视频并调整分辨率,可以使用以下命令:
ffmpeg -i input.mp4 -vf "scale=1280:720" -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
命令解释:
-i input.mp4:指定输入文件。-vf "scale=1280:720":使用视频滤镜scale来调整分辨率为1280x720。-c:v libx264:指定视频编码器为libx264,用于进行H.264编码。-crf 23:设置视频的质量,数值越小表示质量越高,但文件大小也会增加。-c:a aac -b:a 128k:指定音频编码器为AAC,比特率为128kbps。output.mp4:指定输出文件。
根据你的需求,你可以根据需要调整分辨率、视频编码器、音频编码器和其他参数。
提取缩略图
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 thumbnail.jpg
命令解释:
-i input.mp4:指定输入文件。-ss 00:00:05:指定从视频的第5秒开始提取缩略图。-vframes 1:指定提取的缩略图帧数为1。thumbnail.jpg:指定输出的缩略图文件名。
这个命令将从视频的第5秒提取一帧作为缩略图,并保存为thumbnail.jpg。
将多个视频合并
要将多个视频拼接成一个,可以使用FFmpeg的concat协议。以下是具体步骤:
- 创建一个文本文件,例如
input.txt,将需要拼接的视频文件路径逐行写入该文件。确保这些视频文件具有相同的编解码器、分辨率和帧率。 - 使用以下命令将视频文件拼接在一起:
ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4
命令解释:
-f concat:指定使用concat协议进行拼接。-safe 0:允许使用不安全的文件名,以便读取input.txt中的文件路径。-i input.txt:指定输入文件为input.txt,其中包含了需要拼接的视频文件路径。-c copy:表示直接复制视频和音频流,而不进行重新编码。output.mp4:指定输出文件名。
这个命令将按照input.txt中视频文件的顺序将它们拼接在一起,并将结果保存为output.mp4。
压缩视频文件
要使用FFmpeg压缩视频文件,可以通过调整视频编码器和压缩参数来实现。以下是一个简单的例子:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output_compressed.mp4
命令解释:
-i input.mp4:指定输入文件。-c:v libx264:指定视频编码器为libx264,用于进行H.264编码。-crf 23:设置视频的质量,数值越小表示质量越高,但文件大小也会增加。-c:a aac -b:a 128k:指定音频编码器为AAC,比特率为128kbps。output_compressed.mp4:指定输出文件。
通过调整-crf参数,可以平衡视频质量和文件大小。数值越小,视频质量越高,但文件大小也越大。
单独提取视频和音频
要单独提取视频或音频,可以使用以下命令:
提取视频:
ffmpeg -i input.mp4 -c:v copy -an output_video.mp4
命令解释:
-
-i input.mp4:指定输入文件。 -
-c:v copy:表示直接复制视频流,而不进行重新编码。 -
-an:去除音频流。 -
output_video.mp4:指定输出视频文件。
提取音频:
ffmpeg -i input.mp4 -c:a copy -vn output_audio.aac
命令解释:
-i input.mp4:指定输入文件。-c:a copy:表示直接复制音频流,而不进行重新编码。-vn:去除视频流。output_audio.aac:指定输出音频文件。
这两个命令分别用于单独提取视频和音频,保留其中一个流而去除另一个。通过这种方式,可以方便地分离视频和音频流。
总结
通过本文的介绍,希望能够帮助各位在开发过程中快速上手FFmpeg,并在实际应用中灵活运用其丰富的功能进行音视频处理。同时,对音视频基础原理的了解有助于深入理解FFmpeg的命令操作。
参考文章
往期年度总结
往期文章
- ts装饰器的那点东西
- 这是你所知道的ts类型断言和类型守卫吗?
- TypeScript官网内容解读
- 经常使用ts的你,知道这些内容?
- 你有了解过原生css的scope?
- 现在比较常用的移动端调试你知道哪些?
- 众多跨标签页通信方式,你知道哪些?(二)
- 众多跨标签页通信方式,你知道哪些?
- 反调试吗?如何监听devtools的打开与关闭
- 因为原生,选择一家公司(前端如何防笔试作弊)
- 结合开发,带你熟悉package.json与tsconfig.json配置
- 如何优雅的在项目中使用echarts
- 如何优雅的做项目国际化
- 近三个月的排错,原来的憧憬消失喽
- 带你从0开始了解vue3核心(运行时)
- 带你从0开始了解vue3核心(computed, watch)
- 带你从0开始了解vue3核心(响应式)
- 3w+字的后台管理通用功能解决方案送给你
- 入职之前,狂补技术,4w字的前端技术解决方案送给你(vue3 + vite )