您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。本文从实战的角度出发详细讲解ffmpeg命令的使用。 干货满满,建议收藏,需要用到时常看看。小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
前言
ffmpeg的介绍以及安装
ffmpeg是一个非常快速的视频和音频转换器,也可以从实时音频/视频源中抓取。它还可以在任意采样率之间进行转换,并使用高质量的多相滤波器动态调整视频大小。他能够兼容Windows,Linux以及mac三种操作系统(说白了就是这三种操作系统都能用)。ffmpeg的下载地址是:ffmpeg的下载地址 安装过程没啥好说的,按照提示一直点下一步就行了。这里需要说明的一点是ffmpeg安装好之后最好在PATH中配置ffmpeg的环境变量。配置好之后在命令行中输入ffmpeg
会出现如下结果:
基本概念说明
比特率:指的是每秒传送的比特(bit)数,单位是bps。帧速率:指的是每秒刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。单位是fps(Frames per Second)或者"赫兹(Hz)"。
ffmpeg命令使用的通用格式
ffmpeg命令使用的通用格式如下所示:
代码语言:javascript复制ffmpeg [ global_options ] {[ input_file_options ] -i 输入文件地址} ... {[ output_file_options ] 输出文件地址} ...
ffmpeg
:表示调用ffmpeg程序的命令,如果没有配置环境变量的话则需要指定ffmpeg.exe的绝对路径,就像下面这样D:\develop\ffmpeg-4.3.2-2021-02-20-full_build\bin\ffmpeg.exe
global_options
:用于指定全局操作参数,比如 -y 参数,可选的参数。input_file_options
:用于指定输入文件的操作参数,比如:-f concat
参数等 -i
: 指定输入文件的地址,必要参数。output_file_options
: 用于指定输出文件的操作参数,可选参数。
ffmpeg一些常用命令参数
要想熟练的使用ffmpeg命令,就需要掌握ffmpeg的一些常用命令参数。
通用选项
通用选项就是指对音频视频都使用的命令参数。| 参数| 作用 | 作用范围 | 示例 | |--|--|--|--| | -f |强制输入或输出文件格式,通常会自动检测输入文件的格式,并根据输出文件的文件扩展名猜测格式,因此在大多数情况下不需要此选项 |全局 | | | -i 地址|输入文件的地址 |输入 | | | -y |覆盖输出文件,即当output.mp4存在时,不经提示覆盖该文件 |全局 | | | -i | 指定输入文件的地址,如果跟ffmpeg则可以写 xxx.mp4,否则则需要写全路径 | 输入|| | -n | 不要覆盖输出文件,即如果指定的输出文件已经存在,则立即退出 | 全局|| | -stream_loop编号 | 设置输入流应循环的次数。循环 0 表示不循环,循环 -1 表示无限循环。| 输入|| | -c[: stream_specifier ]| 编解码器 |输入/输出,每个流 | -c copy (就是按照输入流的编码称呼输出流)| | -codec[: stream_specifier ]| 编解码器,为一个或多个流选择编码器(在输出文件之前使用时)或者解码器(在输入文件之前使用时) |输入/输出,每个流 |ffmpeg -i 输入 -map 0 -c:v libx264 -c:a 复制输出 (使用 libx264 编码所有视频流并复制所有音频流。)| | -t| 持续时间 |输入/输出,当用作输入选项时,限制从输入文件读取数据的持续时间。当用作输出选项时(在输出url之前),在其持续时间达到duration后停止写入输出。duration必须是持续时间 |-t 20 (持续20秒) | | -fs limit_size| 是指文件大小限制,以字节为单位。超出限制后不会再写入更多的字节块。输出文件的大小略大于请求的文件大小。|输出 || | -ss位置| 当用作输入选项时,在输入文件中寻找位置,多用于视频剪切 |输入/输出 |-ss 15 (从第15秒开始)| | -ss位置| 当用作输入选项时,在输入文件中寻找位置,多用于视频剪切 |输入/输出 |-ss 15 (从第15秒开始)| | -dn| 作为输入选项,阻止文件的所有数据流被过滤或自动选择或映射用于任何输出|输入/输出 |-ss 15 (从第15秒开始)| | -frames[: stream_specifier ]帧数| 即是生成指定帧数的视频|输出 || | -filter[: stream_specifier ] filtergraph ( output,per-stream )| 创建由filtergraph指定的filtergraph并使用它来过滤流,filtergraph是对应用于流的 filtergraph 的描述,并且必须具有相同类型的流的单个输入和单个输出。|输出 ||
视频选项
视频选项,指的是只作用于视频的命令参数。| 参数| 作用 | 作用范围 | 示例 | |--|--|--|--| |-vframes数 |设置要输出的视频帧数 | | | |-r fps |设置帧率(HZ值、分数或缩写),作为输入选项,会忽略视频文件的视频时长,而是假设恒定帧速率fps生成时间戳。作为输出选项,复制或删除输入帧以实现恒定的输出帧速率fps。| 输入/输出 | -r 30 (30帧/秒) | |-s 大小 |设置帧大小,格式为'宽高' | 输入/输出,每个流 | | |-vn |作为输入选项,阻止文件的所有视频流被过滤或自动选择或映射到任何输出,作为输出选项,即自动选择或映射任何视频流,可用于从视频中提取音频 | 输入/输出 | |
音频选项
音频选项,指的是只作用于音频的命令参数。
参数 | 作用 | 作用范围 | 示例 |
---|---|---|---|
-aframes编号 | 设置要输出的音频帧数 | 输出 | |
-ar 频率 | 设置音频采样频率,对于输出流,它默认设置为相应输入流的频率。对于输入流,此选项仅对音频抓取设备和原始解复用器有意义 | 输入/输出 | -ar 24000 (以24000Hz采集音频) |
-aq q | 设置音频质量(只作用于编解码器,VBR) | 输出 | |
-ac 通道 | 设置音频通道数。对于输出流,它默认设置为输入音频通道的数量 | 输入/输出,每个流 | -ac 2 (声道数设置为2) |
-an | 作为输入选项,阻止文件的所有音频流被过滤或自动选择或映射到任何输出,作为输出选项,禁用音频记录,即任何音频流的自动选择或映射 | 输入/输出 | |
-acodec编解码器 | 设置音频编解码器 | 输入/输出 | -acodec aac (音频编码用aac) |
-vol 百分比 | 设置百分之多少的音量 | 输入/输出 | -vol 150(150%的音量) |
-map file:stream | 设置输入/输出流映射 | 输入/输出 |
ffmpeg的实战
说完了ffmpeg的命令参数,接着就让我们来实战一下。示例中的所有视频和音频都放在了D:\ffmpeg_test
目录下。
1.webm转mp4的命令
webm格式的视频是所有浏览器支持的视频格式,前端在录制好视频之后传入给后端一个webm格式的视频,通常我们需要将webm格式的视频转成mp4格式的视频。
代码语言:javascript复制ffmpeg -y -i D:\ffmpeg_test\1.webm -r 30 D:\ffmpeg_test\1.mp4
这里就是将1.webm的视频转成每秒30帧的视频1.mp4。这里指定1.mp4的绝对路径,如果不指定的话则生成的视频文件会落到当前ffmpeg命令的执行目录下。运行结果是:
2. 视频合并命令
当上传的视频比较大时或者用户分段录制视频时,前端会传入多段视频给后端,这时候就需要进行视频的合并操作。使用ffmpeg命令进行视频合并操作分为两步。
- 首先新建一个名为filelist.txt 的文件,在该文件中将需要合并的视频地址写入该文件。比如D: ffmpeg_test目录下有 1.mp4和2.mp4需要合并。则写入的格式如下:
- 执行视频合并的ffmpeg的命令:
ffmpeg -f concat -safe 0 -y -i D:\ffmpeg_test\filelist.txt -c copy -strict -2 D:\ffmpeg_test\concated.mp4
命令的解释:这里就是将前面的filelist.txt记录的1.mp4和2.mp4两个视频合并成一个名为concated.mp4的视频。-f concat
:指定该操作是合并操作 -safe 0
:用于避免操作输入流的权限问题 -c copy
:用于指定输出视频流和输入视频流的编码格式保持一致 -strict -2
:用于避免opus in MP4 support is experimental
这个问题。详细可以参考使用ffmpeg进行视频合并时几个问题记录 Operation not permitted 运行结果是:
3. 视频剪切
原始视频弄好之后,用户可能对视频不太满意,需要将不好的视频片段剪切掉。其操作命令也很简单。这就就是将原始视频concated.mp4从第15秒开始剪切,剪切成一个25秒的新视频clip.mp4。
代码语言:javascript复制ffmpeg -ss 15 -t 25 -i D:\ffmpeg_test\concated.mp4 -c:v libx264 -c:a aac -strict experimental D:\ffmpeg_test\clip.mp4
参数介绍:-ss 15
:从第15秒开始剪切视频。-t 25
:指定剪切后的视频时长为25秒。-c:v libx264
:指定视频的编码格式为libx264格式。-c:a aac
:指定音频的编码格式为aac格式。-strict experimental
:安全处理。运行结果是:
4. 提取音频
现在用户满意的视频剪切好了,用户可以进入配音环节了。在进行配音之前我们首先需要将原视频的音频从原视频中分离出来。提取音频的操作比较简单。其命令是:
代码语言:javascript复制ffmpeg -y -i D:\ffmpeg_test\concated.mp4 -vn D:\ffmpeg_test\output.wav
这里就是从concated.mp4视频中提测其原音频,原音频的名字是output.wav。这里 -vn 指定了输出音频的编码格式跟视频的音频格式保持一致。运行结果是:
5. 音量调整
原视频的音频分离出来之后,用户可以一边播放原音频,一边录制配音了。这时候用户可能需要想调整音频的音量。调整音量的操作也很简单。下面就是将音频的音量调整为原来的80%。
代码语言:javascript复制ffmpeg -y -i D:\ffmpeg_test\output.wav -af "volume=0.8" D:\ffmpeg_test\output_80.wav
或者
ffmpeg -y -i D:\ffmpeg_test\output.wav -vol 80 D:\ffmpeg_test\output_80.wav
这里需要注意的是如果是第一种方式的话-af "volume=数值"
volume的数值必须是除以100之后的值。而-vol 数值
数值直接传入百分比。运行结果是:
6. 音频同轨
配音配好之后,我们想着将原音频和配音音频合并成一条音频,这里就需要进行音频同轨了。其命令是:
代码语言:javascript复制ffmpeg -y -i D:\ffmpeg_test\org_video_sound_input.wav -i D:\ffmpeg_test\org_voice_input.wav -filter_complex amix=inputs=2:duration=longest D:\ffmpeg_test\org_voice_output.wav
这里就是将音频org_video_sound_input.wav和org_voice_input.wav音频合并成一条音频org_voice_output.wav。其核心的命令参数是:-filter_complex amix=inputs=2:duration=longest
:这里使用-filter_complex
指定复杂的过滤器图,amix=inputs=2:duration=longest
采用amix过滤器指定输入音频的数量是2个,时长取最长的那个音频的时长。运行结果是:
7. 配音音频补空白音频
配音配好之后,但是一般情况下配音音频的时长不等于原音频的时长。这时候就需要将没有配音的时长补空白音频。补空白音频的操作稍微有点复杂。其操作思路分为三步。
生成一个跟原音频时长一样的空白音频,其命令是:这里假设原音频的时长是20秒,所以就生成一个时长为20秒的空白音频。
将配音音频开头部分补空白音频(比如用户是从原音频的第2秒处还是配音,那么配音音频的前2秒就需要补空白音频),其命令是:
代码语言:javascript复制ffmpeg -y -i D:\ffmpeg_test\silence.wav -i D:\ffmpeg_test\org_voice_input.wav -filter_complex "aevalsrc=0:d=2 [s1];[s1][1:a]concat=n=2:v=0:a=1[aout]" -c:v copy -map [aout] D:\ffmpeg_test\org_voice_output_silence.wav
其中:D:ffmpeg_testsilence.wav 是第一步生成的空白音频,D:ffmpeg_testorg_voice_input.wav 是用户配音的音频。d=2
:用于指定是补空白的点,就将0秒到2秒这段时长补空白。-c:v copy
:音频的编码格式不变。4. 将补完空白音频的配音音频跟第一步生成的空白音频同轨就得到了一个和原音频时长一样的配音音频。其命令是同第前面的第6节,在此就不在赘述了。
ffmpeg -y -i D:\ffmpeg_test\org_voice_output_silence.wav -i D:\ffmpeg_test\silence.wav -filter_complex amix=inputs=2:duration=longest D:\ffmpeg_test\org_voice_output_result.wav
运行结果是:
8. 给视频添加声音(视频和音频结合)
视频和音频的结合,就是将前面生成的带配音的音频和原视频结合。其命令是:
代码语言:javascript复制ffmpeg -y -i D:\ffmpeg_test\user_video.avi -i D:\ffmpeg_test\org_voice_output_result.wav -c:v copy -c:a aac -strict experimental D:\ffmpeg_test\user_video_target.avi
输入视频是:user_video.mp4,输入音频是:org_voice_output_result.wav。输出视频是:org_voice_output_result.avi -c:v copy
:指定输出视频的格式和输入视频的格式保持一致。-c:a aac
: 指定输出视频的音频编码格式是aac格式。运行结果是:
9. avi转mp4
有点遗憾的是生成的avi格式的视频不能在浏览器上直接播放。所以,我们需要将avi格式的视频转成mp4格式的视频。其转换命令是:
代码语言:javascript复制ffmpeg -y -i D:\ffmpeg_test\user_video_target.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2 D:\ffmpeg_test\user_video_target.mp4
这里输入视频是:user_video_target.avi,输出视频是:user_video_target.mp4。-c:v libx264
:指定视频的编码格式是libx264格式。-c:a aac
:指定音频的编码格式是aac格式。-b:a 192k
:指定输出视频的比特率是192kbits。运行结果是:
总结
本文从实战的角度出发详细介绍了ffmpeg的使用。相信对读者朋友们一定大有帮助。
参考
ffmpeg 常用命令总结:(avi转MP4、MP4转ts、视频压缩、去除视频声音、合并音频和视频) ffmpeg的官方文档
我是码农飞哥,再次感谢您读完本文。