共计 13898 个字符,预计需要花费 35 分钟才能阅读完成。
title: ffmpeg 的根本用法
categories:[ffmpeg]
tags:[音视频编程]
date: 2021/11/18
<div align = ‘right’> 作者:hackett</div>
<div align = ‘right’> 微信公众号:加班猿 </div>
一、ffmpeg 的装置
1.Centos 装置
FFmpeg 在默认的 CentOS 8 源仓库中没有提供。你能够抉择通过源文件编译装置 FFmpeg,或者应用 dnf
工具从 Negativo17
源仓库中装置。咱们将会应用第二个选项。
实现上面的步骤,在 CentOS 8 上装置 FFmpeg:
1.Negativo17 软件源依赖 EPEL 和 PowerTools 软件源。以 root 或者其余有 sudo 权限的用户身份运行上面的命令,启用必须的软件源:
sudo dnf install epel-release
sudo yum config-manager --set-enabled PowerTools
sudo yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo
2. 一旦软件源被启用,装置 FFmpeg:
sudo dnf install ffmpeg
3. 通过检测版本号,验证 FFmpeg 装置:
ffmpeg -version
4.Negativo17 软件源中的 ffmpeg 以后版本是4.2.5
ffmpeg version 4.2.5 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 8 (GCC)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --extra-ldflags='-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmp3lame --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librsvg --enable-libsrt --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-version3 --enable-vapoursynth --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg --enable-libzvbi --enable-avfilter --enable-avresample --enable-libmodplug --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-libmfx --enable-runtime-cpudetect
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
2.Windows 装置
官网地址:http://ffmpeg.org/download.html
抉择 Windows 的版本,跳转到 GitHub 下载地址:https://github.com/BtbN/FFmpe…
下载最新的带 share 版本的,就是曾经编译好了的,不必本人再编译 ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4.zip
解压进去放到装置软件的盘符,增加环境变量即可 D:\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\bin
不重启使 Windows 环境变量失效,cmd,输出 set path = D:\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\bin
重启命令提示符终端,测试成果: cmd,输出 ffmpeg -version 失去如下成果即为胜利装置
二、ffmpeg 次要组成部分
1、libavformat:用于各种音视频封装格局的生成和解析,包含获取解码所需信息以生成解码上下文构造和读取音视频帧等性能,蕴含 demuxers 和 muxer 库;
2、libavcodec:用于各种类型声音 / 图像编解码;
3、libavutil:蕴含一些公共的工具函数;
4、libswscale:用于视频场景比例缩放、色调映射转换;
5、libpostproc:用于前期成果解决;
6、ffmpeg:是一个命令行工具,用来对视频文件转换格局,也反对对电视卡实时编码;
7、ffsever:是一个 HTTP 多媒体实时播送流服务器,反对时光平移;
8、ffplay:是一个简略的播放器,应用 ffmpeg 库解析和解码,通过 SDL 显示;
在这组成部分中,须要相熟根底概念有
容器(Container)
容器就是一种文件格式,比方 flv,mkv 等。蕴含上面 5 种流以及文件头信息。
流(Stream)
是一种视频数据信息的传输方式,5 种流:音频,视频,字幕,附件,数据。
帧(Frame)
帧代表一幅静止的图像,分为 I 帧,P 帧,B 帧。
编解码器(Codec)
是对视频进行压缩或者解压缩,CODEC =COde(编码)+DECode(解码)
复用 / 解复用(mux/demux)
把不同的流依照某种容器的规定放入容器,这种行为叫做复用(mux)
把不同的流从某种容器中解析进去,这种行为叫做解复用(demux)
查看帮忙
可用的 bit 流:ffmpeg –bsfs
可用的编解码器:ffmpeg –codecs
可用的解码器:ffmpeg –decoders
可用的编码器:ffmpeg –encoders
可用的过滤器:ffmpeg –filters
可用的视频格式:ffmpeg –formats
可用的声道布局:ffmpeg –layouts
可用的 license:ffmpeg –L
可用的像素格局:ffmpeg –pix_fmts
可用的协定:ffmpeg -protocals
三、ffmpeg 常用命令
应用 ffmpeg 命令 的 根本模式 是:
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
usage: ffmpeg [全局参数] {[输出文件参数] -i 输出文件地址} ... {[输入文件参数] 输入文件地址} ...
次要全局参数:
-i 设定输出流
-f 设定输入格局
-ss 开始工夫
输入视频文件参数:
-b 设定视频流量(码率),默认为 200Kbit/s
-r 设定帧速率,默认为 25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不解决视频
-vcodec 设定视频编解码器,未设定时则应用与输出流雷同的编解码器
-qscale 0 保留原始的视频品质
输入音频文件参数:
-ar 设定采样率
-ac 设定声音的 Channel 数
-acodec 设定声音编解码器,未设定时则应用与输出流雷同的编解码器
-an 不解决音频
1. 获取媒体文件信息
ffmpeg -i file_name
ffmpeg -i video_file.mp4
ffmpeg -i audio_file.mp3
ffmpeg -i video_file.mp4 -hide_banner #hide_banner 来暗藏掉 ffmpeg 自身的信息
ffmpeg -i audio_file.mp3 -hide_banner
2. 转换媒体文件
ffmpeg 最让人称道罕用的恐怕就是你轻而易举的在不同媒体格式之间进行自在转换了。你是要指明输出和输入文件名就行了,ffmpeg 会从后缀名猜想格局,这个办法同时实用于视频和音频文件
上面是一些例子:
ffmpeg -i video_input.mp4 video_output.avi
ffmpeg -i video_input.webm video_output.flv
ffmpeg -i audio_input.mp3 audio_output.ogg
ffmpeg -i audio_input.wav audio_output.flac
你也能够同时指定多个输入后缀:
ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg
这样会同时输入多个文件.
想看反对的格局,能够用:
ffmpeg -formats
同样的,你能够应用 -hide_banner 来省略一些程序信息。
你能够在输入文件前应用 -qscale 0 来保留原始的视频品质:
ffmpeg -i video_input.wav -qscale 0 video_output.mp4
3. 从视频中抽取音频
为了从视频文件中抽取音频,间接加一个 -vn 参数就能够了
ffmpeg -i video.mp4 -vn audio.mp3
这会让命令复用原有文件的比特率,一般来说,应用 -ab (音频比特率)来指定编码比特率是比拟好的:
ffmpeg -i video.mp4 -vn -ab 128k audio.mp3
一些常见的比特率有 96k, 128k, 192k, 256k, 320k (mp3 也能够应用最高的比特率)。
其余的一些罕用的参数比方 -ar (采样率 : 22050, 441000, 48000), -ac ( 声道数 ), -f ( 音频格式, 通常会自动识别的). -ab 也能够应用 -b:a 来代替. 比方:
ffmpeg -i video.mov -vn -ar 44100 -ac 2 -b:a 128k -f mp3 audio.mp3
4. 从视频中抽取视频(让视频静音)
和之前的要求相似,咱们能够应用 -an 来取得纯视频(之前是 -vn)
ffmpeg -i video_input.mp4 -an -video_output.mp4
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
Note: 这个 -an 标记会让所有的音频参数有效,因为最初没有音频会产生。
5. 从视频中提取图片
这个性能可能对很多人都挺有用,比方你可能有一些幻灯片,你想从外面提取所有的图片,那么上面这个命令就能帮你:
ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png
咱们来解释一下这个命令:
-r 代表了帧率(一秒内导出多少张图像,默认 25),-f 代表了输入格局(image2 实际上上 image2 序列的意思)。
最初一个参数 (输入文件) 有一个乏味的命名:它应用 %3d 来批示输入的图片有三位数字 (000, 001, 等等.)。你也能够用 %2d (两位数字) 或者 %4d (4 位数字),只有你违心,你能够轻易试验 一下能够怎么写!
Note: 同样也有将图片转变为视频 / 幻灯片的形式,上面的 高级利用 中会讲到。
6. 更改视频分辨率或长宽比
对 ffmpeg 来说又是个简略的工作,你只须要应用 -s 参数来缩放视频就行了:
ffmpeg -i video_input.mov -s 1024x576 video_output.mp4
同时,你可能须要应用 -c:a 来保障音频编码是正确的:
ffmpeg -i video_input.h264 -s 640x480 -c:a video_output.mov
你也可是应用-aspect 来更改长宽比:
ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4
Note: 在高级利用中还会提到更弱小的办法
7. 为音频减少封面图片
有个很棒的办法把音频变成视频,全程应用一张图片(比方专辑封面)。当你想往某个网站上传音频,但那个网站又仅承受视频(比方 YouTube, Facebook 等)的状况下会十分有用。
上面是例子:
ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
只有改一下编码设置 (-c:v 是 视频编码,-c:a 是音频编码) 和文件的名称就能用了。
Note: 如果你应用一个较新的 ffmpeg 版本(4.x),你就能够不指定 -strict experimental
8. 为视频减少字幕
另一个常见又很容易实现的要求是给视频减少字母,比方一部外文电源,应用上面的命令:
ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4
当然,你能够指定本人的编码器和任何其余的音频视频参数。你能够浏览这篇文章来理解字幕相干内容 editing subtitles in Linux。
9. 压缩媒体文件
压缩文件能够极大缩小文件的体积,节约存储空间,这对于文件传输尤为重要。通过 ffmepg,有好几个办法来压缩文件体积。
Note: 文件压缩的太厉害会让文件品质显著升高。
首先,对于音频文件,能够通过升高比特率(应用 -b:a 或 -ab):
ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3
ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3
再次重申,一些罕用的比特率有: 96k, 112k, 128k, 160k, 192k, 256k, 320k. 值越大,文件所须要的体积就越大。
对于视频文件,选项就多了,一个简略的办法是通过升高视频比特率 (通过 -b:v):
ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4
Note: 视频的比特率和音频是不同的(个别要大得多)。
你也能够应用 -crf 参数 (恒定品质因子). 较小的crf 意味着较大的码率。同时应用 libx264 编码器也有助于减小文件体积。这里有个例子,压缩的不错,品质也不会显著变动:
ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4
crf 设置为 20 到 30 是最常见的,不过您也能够尝试一些其余的值。
升高帧率在有些状况下也能无效(不过这往往让视频看起来很卡):
ffmpeg -i video_input.mp4 -r 24 video_output.mp4
-r 批示了帧率 (这里是 24)。
你还能够通过压缩音频来升高视频文件的体积,比方设置为立体声或者升高比特率:
ffmpeg -i video_input.mp4 -c:v libx264 -ac 2 -c:a aac -strict -2 -b:a 128k -crf 28 video_output.mp4
Note: -strict -2 和 -ac 2 是来解决立体声局部的。
10. 裁剪媒体文件(根底)
想要从结尾开始剪辑一部分,应用 T -t 参数来指定一个工夫:
ffmpeg -i input_video.mp4 -t 5 output_video.mp4
ffmpeg -i input_audio.wav -t 00:00:05 output_audio.wav
这个参数对音频和视频都实用,下面两个命令做了相似的事件:保留一段 5s 的输入文件(文件结尾开始算)。下面应用了两种不同的示意工夫的形式,一个单纯的数字(形容)或者 HH:MM:SS (小时, 分钟, 秒). 第二种形式实际上批示了完结工夫。
也能够通过 -ss 给出一个开始工夫,-to 给出完结工夫:
ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3
ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav
ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264
ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg
能够看到 开始工夫 (-ss HH:MM:SS), 继续秒数 (-t duration), 完结工夫 (-to HH:MM:SS), 和 开始秒数 (-s duration) 的用法.
你能够在媒体文件的任何局部应用这些命令。
11. 输入 YUV420 原始数据
对于一下做底层编解码的人来说,有时候常要提取视频的 YUV 原始数据。怎么坐?很简答:ffmpeg -i input.mp4 output.yuv
怎么样,是不是太简略啦?!!!哈哈(如果你想问 yuv 的数据,如何播放,我不会通知你,RawPlayer 挺好用的!!)
那如果我只想要抽取某一帧 YUV 呢?简略,你先用下面的办法,先抽出 jpeg 图片,而后把 jpeg 转为 YUV。比方:你先抽取 10 帧图片。ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
后果:
-rw-rw-r-- 1 hackett hackett 296254 7 月 20 16:08 pic-001.jpeg
-rw-rw-r-- 1 hackett hackett 300975 7 月 20 16:08 pic-002.jpeg
-rw-rw-r-- 1 hackett hackett 310130 7 月 20 16:08 pic-003.jpeg
-rw-rw-r-- 1 hackett hackett 268694 7 月 20 16:08 pic-004.jpeg
-rw-rw-r-- 1 hackett hackett 301056 7 月 20 16:08 pic-005.jpeg
-rw-rw-r-- 1 hackett hackett 293927 7 月 20 16:08 pic-006.jpeg
-rw-rw-r-- 1 hackett hackett 340295 7 月 20 16:08 pic-007.jpeg
-rw-rw-r-- 1 hackett hackett 430787 7 月 20 16:08 pic-008.jpeg
-rw-rw-r-- 1 hackett hackett 404552 7 月 20 16:08 pic-009.jpeg
-rw-rw-r-- 1 hackett hackett 412691 7 月 20 16:08 pic-010.jpeg
而后,你就轻易挑一张,转为 YUV: ffmpeg -i pic-001.jpeg -s 1440x1440 -pix_fmt yuv420p xxx3.yuv
如果 - s 参数不写,则输入大小与输出一样。当然了,YUV 还有 yuv422p 啥的,你在 -pix_fmt 换成 yuv422p 就行啦!
12. 视频增加 logo
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
13. 提取视频 ES 数据
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
14. 视频编码格局转换
比方一个视频的编码是 MPEG4,想用 H264 编码,咋办?
ffmpeg -i input.mp4 -vcodec h264 output.mp4
相同也一样
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
15. 增加字幕
语法 –vf subtitles=file
ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4
ffmpeg: 高级应用
当初该开始讲述一些高级的个性了(比方截屏等),让咱们开始吧。
1. 宰割媒体文件
后面曾经讲述了如何裁剪文件,那么如何宰割媒体文件呢?只须要为每个输入文件别离指定开始工夫、完结或者持续时间就能够了。
看上面这个例子:
ffmpeg -i video.mp4 -t 00:00:30 video_1.mp4 -ss 00:00:30 video_2.mp4
语法很简略,为第一个文件指定了 -t 00:00:30 作为持续时间(第一个局部是原始文件的前 30 秒内容),而后指定接下来的所有内容作为第二个文件(从第一局部的完结工夫开始,也就是 00:00:30)。
你能够任意指定多少个局部,尝试一下吧,这个性能真的很厉害,同时它也实用用音频文件。
2. 拼接媒体文件
ffmpeg 也能够进行相同的动作:把多个文件合在一起。
为了实现这一点,你得用本人棘手的编辑器来创立一个文本文件。
因为我喜爱应用终端,所以这里我用了 touch 和 vim. 文件名无关紧要,这里我用 touch 命令创立 video_to_join.txt 文件:
touch videos_to_join.txt
当初,应用 vim 编辑它:
vim videos_to_join.txt
你能够应用任何你喜爱的工具,比方 nano,gedit 等等。
在文件内容中, 输入您想拼接的文件的残缺门路(文件会依照程序拼合在一起),一行一个文件。确保他们领有雷同的后缀名。上面是我的例子:
/home/ubuntu/Desktop/video_1.mp4
/home/ubuntu/Desktop/video_2.mp4
/home/ubuntu/Desktop/video_3.mp4
保留这个文件,同样这个办法实用与任何音频或者视频文件。
而后应用上面的命令:
ffmpeg -f concat -i join.txt output.mp4
Note: 应用的输入文件的名称是 output.mp4, 因为我的输出文件都是 mp4 的。
这样,你 videos_to_join.txt 里的所有文件都会被拼接成一个独立的文件了。
3. 将图片转变为视频
这会通知你如何将图片变成幻灯片秀,同时也会通知你如何加上音频。
首先我建议您将所有的图片放到一个文件夹上面,我把它们放到了 my_photos 里,同时图片的后缀名最好是 .png 或者 .jpg,不论选那个,他们应该是同一个后缀名,否则 ffmpeg 可能会工作的不失常,您能够很不便的把 .png 转变为 .jpg(或者倒过去也行)。
咱们这次转换的格局 (-f) 应该被设置为 image2pipe. 你必须应用应用连词符 (–) 来指明输出。image2pipe 容许你应用管道 (在命令间应用 |)的后果而不是文件作为 ffmpeg 的输出。命令后果便是将所有图片的内容一一输入,还要留神指明视频编码器是 copy (-c:v copy) 以正确应用图片输出:
cat my_photos/* | ffmpeg -f image2pipe -i - -c:v copy video.mkv
如果你播放这个文件,你可能会感觉只有一部分图片被退出了,事实上所有的图片都在,然而ffmpeg 播放它们的时候太快了,默认是 23fps,一秒播放了 23 张图片。
你应该指定帧率 (-framerate) :
cat my_photos/* | ffmpeg -framerate 1 -f image2pipe -i - -c:v copy video.mkv
在这个例子里,把帧率设置为 1,也就是每帧(每张图)会显示 1 秒。
为了加一些声音,能够应用音频文件作为输出 (-i audo_file) 并且设定 copy 音频编码 (-c:a copy). 你能够同时为音频和视频设定编码器,在输入文件前设置就能够了。你要计算一下音频文件的长度和图片张数,已确定适合的帧率。比方我的音频文件是 22 秒,图片有 9 张,那么帧率应该是 9 / 22 大概 0.4,所以我这么输出命令:
cat my_photos/* | ffmpeg -framerate 0.40 -f image2pipe -i - -i audio.wav -c copy video.mkv
4. 录制屏幕
通过 ffmpeg 录制屏幕同样没有艰难的,将格局(-f) 设定为x11grab. 他就会抓取你的XSERVER. 输出的话能够这是屏幕编号(个别都是0:0). 抓取是从左上角开始计算的,能够指定屏幕分辨率 (-s). 我的屏幕是 1920×1080. 留神屏幕分辨率硬在输出之前指定t:
ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4
按 q 或者 CTRL+C 以完结录制屏幕。
小技巧:你能够通过命令取得实在的分辨率而不是写死一个固定的大小:
-s $(xdpyinfo | grep dimensions | awk '{print $2;}')
残缺的命令这么写:
ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 output.mp4
5. 录制摄像头
从摄像头录制就更简略了,linux 上设施都是在 /dev 中的,比方 /dev/video0, /dev/video1, etc.:
ffmpeg -i /dev/video0 output.mkv
同样, q 或者 CTRL+C 来完结录制。
6. 录制声音
Linux 上同时是应用 ALSA 和 pulseaudio 来解决声音的。ffmpeg 能够录制两者,不过我要特地阐明 pulseaudio, 因为 Debian 系列的发行版默认用了它。命令如下:
在 pulseaudio, 你必须强制指定(-f) alsa 而后指定 default 作为输出t (-i default):
ffmpeg -f alsa -i default output.mp3
Note: 在你零碎音频设置里,应该能看到默认的录音设施。
我常常玩吉他,我平时应用一个业余音频设备能力录制声音,当我发现 ffmpeg 也能够很轻松的录制的时候颇为诧异。
录制小贴士
对于录制工作来说,通常都须要指定编码器以及帧率,之前讲过的参数当然也能够用到这里来!
ffmpeg -i /dev/video0 -f alsa -i default -c:v libx264 -c:a flac -r 30 output.mkv
有时候不间接录音,而是在录屏 / 录像的时候给一个音频文件,那么能够这么做:
ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 -i audio.wav -c:a copy output.mp4
Note: ffmpeg 应用片段录取,所有有时候十分短的录制可能不会保留文件。我倡议录地能够略微长一些(而后前期裁剪),已保障录制的文件胜利写到磁盘上。
7. 截图
每隔一秒截一张图
ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
每隔 20 秒截一张图
ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png
ffmpeg 中的过滤器的根本应用
过滤器 是 ffmpeg 中最为弱小的性能。在 ffmepg 中无数不甚数的过滤器存在,能够满足各种编辑须要。因为过滤器切实太多了,这里只会简略讲述几个罕用的。
应用 过滤的根本构造是:
ffmpeg -i input.mp4 -vf "filter=setting_1=value_1:setting_2=value_2,etc" output.mp4
ffmpeg -i input.wav -af "filter=setting_1=value_1:setting_2=value_2,etc" output.wav
能够指定视频过滤器 (-vf, -filter:v的简写) 和 音频过滤器 (-af, -filter:a的简写). 过滤器的内容写到双引号外面 (“) 并且能够应用逗号 (,) 连贯。你能够应用任意数量的过滤器(我写了个 etc 代表更多的,这不是做一个实在的过滤器)。
过滤器设定的通常格局是:
filter=setting_2=value_2:setting_2=value_2
过滤器不同的值应用冒号宰割。
你甚至能够在值外面应用进行数学符号计算。
Note: 参考 ffmpeg 过滤器手册 *.* 查看更多高级用法
这里举几个例子来阐明视频和音频的过滤器。
1. 视频缩放
这是个简略过滤器,设定里只有 width 和 height:
ffmpeg -i input.mp4 -vf "scale=w=800:h=600" output.mp4
我说过你能够应用数学运算来给值:
ffmpeg -i input.mkv -vf "scale=w=1/2*in_w:h=1/2*in_h" output.mkv
很显著,这个命令让输出的尺寸变成了输出尺寸 (in_w, in_h) 的 1 /2.
2. 视频裁剪
相似缩放,这个设定也有 width 和 height,另外能够指定裁剪的原点(默认是视频的核心)
ffmpeg -i input.mp4 -vf "crop=w=1280:h=720:x=0:y=0" output.mp4
ffmpeg -i input.mkv -vf "crop=w=400:h=400" output.mkv
第二个命令裁剪原点是视频的中心点(因为我没有给 x 和 y 坐标),第一个命令会从左上角开始裁剪 (x=0:y=0).
这里也有一个应用数学计算的例子:
ffmpeg -i input.mkv -vf "crop=w=3/4*in_w:h=3/4*in_h" output.mkv
这会把视频裁剪剩下原大小的 3 /4/。
3. 视频旋转
你能够指定一个弧度,顺时针旋转视频。为了让计算简略一些,你能够给角度而后乘以 PI/180:
ffmpeg -i input.avi -vf "rotate=90*PI/180"
ffmpeg -i input.mp4 -vf "rotate=PI"
第一个命令将视频顺时针旋转 90°,第二个则是上下颠倒了视频(翻转了 180°)。
4. 音频声道重映射
有的时候,你的音频只有右耳能够听到声音,那么这个性能就很有用了。你能够让声音同时在左右声道呈现:
ffmpeg -i input.mp3 -af "channelmap=1-0|1-1" output.mp3
这将右声道(1)同时映射到左(0)右(1)两个声道(右边的数字是输出,左边的数字是输入)。
5. 更改音量
你能够将音量大小乘以一个实数(能够是整数也能够不是),你只须要给出那个数大小就行了。
ffmpeg -i input.wav -af "volume=1.5" output.wav
ffmpeg -i input.ogg -af "volume=0.75" output.ogg
第一个将音量变为 1.5 倍,第二个则让音量变成了原来的 1 / 4 那么宁静。
技巧:更改播放速度
这里会介绍视频(不影响音频)和音频的过滤器。
- 视频
视频过滤器是 setpts (PTS = presentation time stamp). 这个参数以一种乏味的形式工作,因为咱们批改的是 PTS,所以较大的数值意味着较慢的播放速度,反之亦然:
ffmpeg -i input.mkv -vf "setpts=0.5*PTS" output.mkv
ffmpeg -i input.mp4 -vf "setpts=2*PTS" output,mp4
第一个命令让播放速度加倍了,第二个则是让播放速度升高了一半。
2. 音频
这里的过滤器是 atempo. 这里有个限度,它只承受 0.5(半速) 到 2 (倍速)之间的值。为了越过这个限度,你能够链式应用这个过滤器:
ffmpeg -i input.wav -af "atempo=0.75" output.wav
ffmpeg -i input.mp3 -af "atempo=2.0,atempo=2.0" ouutput.mp3
第一个命令让音频速度慢了 1 /4,第二个则是减速到原来的 4(2*2)倍。
Note: 如果想在同一个命令中同时批改视频和音频的速度,你得查看一下 filtergraphs.
如果你感觉文章还不错,能够给个 ”三连“
我是 加班猿,咱们下期见