ffmpeg
参考:https://zhuanlan.zhihu.com/p/455572544
1|0ffmpeg介绍
ffmpeg 是一个处理媒体文件的命令行工具 (command line based) 。它是一个拥有非常多功能的框架,并且因为他是开源的,很多知名的工具如 VLC,YouTube, iTunes 等等,都是再其之上开发出来的。
ffmpeg最吸引我的地方就是它可以用非常简练的方式(通过一两个命令)完成许多的处理任务,当然,作为一个强大的工具,他也有很多较为复杂的使用方式,有些时候甚至可以代替一个完整的视频处理流程。
2|0安装
2|1mac
3|0基础使用
3|1命令
使用 ffmpeg 命令 的基本形式是:
要注意的是,所有的参数仅仅对仅接下来的文件有效(下一个文件得把参数再写一遍)。
所有没有使用 -i 指定的文件都被认为是输出文件。 Ffmpeg 可以接受多个输入文件并输出到您指定的位置。你也可以将输入输出都指定为同一个文件名,不过这个时候要在输出文件前使用用 -y 标记。
注意:
你不应该将输入和输出混淆,先指定输入,再指定输出文件
3|2获得媒体文件的信息
ffmpeg 最简单的使用就是用来 显示文件信息 。不用给输出,只是简单的写:
视频和音频文件都可以使用:
通过ffmpeg查看文件属性
命令会输出很多与您文件无关的信息(ffmpeg本身的信息),虽说这个蛮有用的,你可以使用 -hide_banner 来隐藏掉它们:
3|3转换媒体文件
ffmpeg 最让人称道常用的恐怕就是你轻而易举的在不同媒体格式之间进行自由转换了。你是要指明输入和输出文件名就行了, ffmpeg 会从后缀名猜测格式,这个方法同时适用于视频和音频文件
下面是一些例子:
你也可以同时指定多个输出后缀:
这样会同时输出多个文件.
想看支持的格式,可以用:
同样的,你可以使用 -hide_banner 来省略一些程序信息。
你可以在输出文件前使用 -qscale 0 来保留原始的视频质量:
进一步,在 FFmpeg 中,"-c:a" 选项用于指定要使用的音频编码器,"-c:v" 选项用于指定要使用的视频编码器。这些选项可以在转码过程中重新编码音频和视频流,以更改编码格式、码率、分辨率、帧率等参数。
例如,"-c:a libmp3lame" 将使用 LAME MP3 编码器来压缩音频流;而 "-c:v libx264" 将使用 x264 编码器来压缩视频流。如果使用 "-c:a copy" 和 "-c:v copy",则会使用与源文件相同的编码器,而不会对音频和视频进行重新编码。
注意:
这样做会让文件后缀使人困惑,所以请避免这么做。
3|4从视频中抽取音频
为了从视频文件中抽取音频,直接加一个 -vn 参数就可以了:
这会让命令复用原有文件的比特率,一般来说,使用 -ab (音频比特率)来指定编码比特率是比较好的:
一些常见的比特率有 96k, 128k, 192k, 256k, 320k (mp3也可以使用最高的比特率)。
其他的一些常用的参数比如 -ar (采样率: 22050, 441000, 48000), -ac (声道数), -f (音频格式, 通常会自动识别的). -ab 也可以使用 -b:a 来替代. 比如:
3|5让视频静音
和之前的要求类似,我们可以使用 -an 来获得纯视频(之前是 -vn).
注意:
这个 -an 标记会让所有的音频参数无效,因为最后没有音频会产生。
3|6从视频中提取图片
这个功能可能对很多人都挺有用,比如你可能有一些幻灯片,你想从里面提取所有的图片,那么下面这个命令就能帮你:
3|7更改视频分辨率或长宽比
对 ffmpeg 来说又是个简单的任务,你只需要使用 -s 参数来缩放视频就行了:
如果不指定音频编码器,则 FFmpeg 默认会将音频流转换为 AAC 格式并使用 libfdk_aac 编码器进行编码。如果源文件没有音频流,则输出文件仍将包含一个空的音频流,其大小可能非常大。因此,如果源文件没有音频流,最好使用 "-an" 选项禁用音频流,以避免输出文件包含不必要的空的音频流。完整命令如下:
如果源文件 "video_input.h264" 中包含音频流,但没有指定音频编码器 ("-c:a" 选项),则 FFmpeg 默认会将音频流转换为 AAC 格式并使用 libfdk_aac 编码器进行编码。输出文件 "video_output.mov" 包含编码后的音频流和视频流。如果源文件中的音频流已经压缩或编码过,再对其进行重新编码可能会导致音频质量损失和文件大小增加。
如果您知道源文件中的音频流已经是所需的编码和格式,可以使用 "-c:a copy" 选项将音频流直接复制到输出文件中,而无需进行重新编码。这将保留原始音频流的质量和格式,并且可以显著减少处理时间和输出文件的大小。完整命令如下:
你也可是使用-aspect 来更改长宽比:
3|8为音频增加封面图片
有个很棒的方法把音频变成视频,全程使用一张图片(比如专辑封面)。当你想往某个网站上传音频,但那个网站又仅接受视频(比如YouTube, Facebook等)的情况下会非常有用。
下面是例子:
3|9为视频增加字幕
另一个常见又很容易实现的要求是给视频增加字母,比如一部外文电源,使用下面的命令将一个 MP4 视频文件 "video.mp4" 与一个 SRT 格式的字幕文件 "subtitles.srt" 结合,生成一个包含字幕的 MP4 文件 "output.mp4"
在 FFmpeg 中,视频编码器的 "-preset" 选项可以用于设置编码器的编码速度和输出质量之间的权衡。不同的预设参数会影响编码器的速度和输出质量。以下是一些常用的预设参数:
- ultrafast:最快的编码速度,但输出质量较低。
- superfast:非常快的编码速度,输出质量略低于 ultrafast。
- veryfast:快速的编码速度,输出质量略低于 superfast。
- faster:比 veryfast 慢一些,但输出质量更好。
- fast:比 faster 慢一些,输出质量更好。
- medium:默认预设,输出质量和编码速度相对平衡。
- slow:比 medium 慢一些,输出质量更好。
- slower:比 slow 慢一些,输出质量更好。
- veryslow:最慢的编码速度,但输出质量最好。
这些预设参数会影响编码器的速度和输出质量,选择哪个预设参数应该根据实际需求进行权衡。例如,如果需要快速地对视频进行编码,可以选择较快的预设参数(如 ultrafast 或者 superfast)。如果需要更好的输出质量,可以选择较慢的预设参数(如 slow 或者 veryslow)。
在 FFmpeg 中,字幕编码器的 "-c:s" 选项用于指定输出字幕的编码方式。以下是常用的字幕编码器及其选项:
- srt:SRT 字幕编码器,选项为 srt。使用 SRT 格式对字幕进行编码,生成的字幕文件后缀为 .srt。
- ass:ASS 字幕编码器,选项为 ass。使用 ASS 格式对字幕进行编码,支持更多的字幕效果和布局控制,生成的字幕文件后缀为 .ass。
- subrip:SubRip 字幕编码器,选项为 subrip。使用 SubRip 格式对字幕进行编码,与 SRT 类似,生成的字幕文件后缀为 .srt。
- webvtt:WebVTT 字幕编码器,选项为 webvtt。使用 WebVTT 格式对字幕进行编码,支持多语言和多轨字幕,生成的字幕文件后缀为 .vtt。
- mov_text:MOV_TEXT 字幕编码器,选项为 mov_text。使用 MOV_TEXT 格式对字幕进行编码,支持多语言和多轨字幕,生成的字幕文件后缀为 .mov。
选择字幕编码器时,应根据实际需求和字幕文件格式进行选择。例如,如果需要与其他软件兼容,可以选择 SRT 或 SubRip 字幕编码器;如果需要更丰富的字幕效果和控制,可以选择 ASS 字幕编码器;如果需要在 Web 上播放,可以选择 WebVTT 字幕编码器;如果需要与 QuickTime 兼容,可以选择 MOV_TEXT 字幕编码器。
3|10压缩媒体文件
压缩文件可以极大减少文件的体积,节约存储空间,这对于文件传输尤为重要。通过ffmepg,有好几个方法来压缩文件体积。
注意:
文件压缩的太厉害会让文件质量显著降低。
首先,对于音频文件,可以通过降低比特率(使用 -b:a 或 -ab):
再次重申,一些常用的比特率有: 96k, 112k, 128k, 160k, 192k, 256k, 320k.值越大,文件所需要的体积就越大。
对于视频文件,选项就多了,一个简单的方法是通过降低视频比特率 (通过 -b:v):
你也可以使用 -crf 参数 (恒定质量因子). 较小的crf 意味着较大的码率。同时使用 libx264 编码器也有助于减小文件体积。这里有个例子,压缩的不错,质量也不会显著变化:
crf 设置为20 到 30 是最常见的,不过您也可以尝试一些其他的值。
降低帧率在有些情况下也能有效(不过这往往让视频看起来很卡):
-r 指示了帧率 (这里是 24)。
你还可以通过压缩音频来降低视频文件的体积,比如设置为立体声或者降低比特率:
3|11裁剪媒体文件(基础)
想要从开头开始剪辑一部分,使用T -t 参数来指定一个时间:
这个参数对音频和视频都适用,上面两个命令做了类似的事情:保存一段5s的输出文件(文件开头开始算)。上面使用了两种不同的表示时间的方式,一个单纯的数字(描述)或者 HH:MM:SS (小时, 分钟, 秒). 第二种方式实际上指示了结束时间。
也可以通过 -ss 给出一个开始时间,-to 给出结束时间:
开始时间 (-ss HH:MM:SS), 持续秒数 (-t duration), 结束时间 (-to HH:MM:SS)
4|0高级使用
4|1分割媒体文件
前面已经讲述了如何裁剪文件,那么如何分割媒体文件呢?只需要为每个输出文件分别指定开始时间、结束或者持续时间就可以了。
看下面这个例子:
语法很简单,为第一个文件指定了 -t 00:00:30 作为持续时间(第一个部分是原始文件的前30秒内容),然后指定接下来的所有内容作为第二个文件(从第一部分的结束时间开始,也就是 00:00:30)。
4|2拼接媒体文件
ffmpeg 也可以进行相反的动作:把多个文件合在一起。
这样,你 videos_to_join.txt 里的所有文件都会被拼接成一个独立的文件了。
4|3将图片转变为视频
首先将所有的图片放到一个文件夹下面,比如放到 my_photos 里,同时图片的后缀名最好是 .png 或者 .jpg, 不管选那个,他们应该是同一个后缀名,否则ffmpeg可能会工作的不正常,ffmpeg本身有命令可以很方便的把 .png 转变为 .jpg (或者倒过来也行)
转换的格式 (-f) 应该被设置为 image2pipe. 你必须使用使用连词符(–)来指明输入。 image2pipe 允许你使用管道 (在命令间使用 |)的结果而不是文件作为ffmpeg的输入。命令结果便是将所有图片的内容逐个输出,还要注意指明视频编码器是 copy (-c:v copy) 以正确使用图片输入:
如果你播放这个文件,你可能会觉得只有一部分图片被加入了,事实上所有的图片都在,但是ffmpeg 播放它们的时候太快了,默认是23fps,一秒播放了23张图片
你应该指定帧率 (-framerate) :
在这个例子里,把帧率设置为1,也就是每帧(每张图)会显示1秒。
为了加一些声音,可以使用音频文件作为输入 (-i audo_file) 并且设定copy音频编码 (-c:a copy). 你可以同时为音频和视频设定编码器,在输出文件前设置就可以了。你要计算一下音频文件的长度和图片张数,已确定合适的帧率。比如我的音频文件是22秒,图片有9张,那么帧率应该是 9 / 22 大约0.4,所以我这么输入命令:
4|4录制屏幕
通过 ffmpeg 录制屏幕同样没有困难的,将格式(-f) 设定为x11grab. 他就会抓取你的XSERVER. 输入的话可以这是屏幕编号(一般都是0:0). 抓取是从左上角开始计算的,可以指定屏幕分辨率 (-s). 我的屏幕是 1920×1080. 注意屏幕分辨率硬在输入之前指定t:
按 q 或者 CTRL+C 以结束录制屏幕。
小技巧:你可以通过命令获得真实的分辨率而不是写死一个固定的大小:
完整的命令这么写:
4|5录制摄像头
从摄像头录制就更简单了,linux上设备都是在/dev中的,比如 /dev/video0, /dev/video1, etc.:
同样, q 或者 CTRL+C 来结束录制。
5|0ffmpeg中的过滤器的基本使用
过滤器 是 ffmpeg 中最为强大的功能。
使用 过滤的基本结构是:
可以指定视频过滤器 (-vf, -filter:v的简写) 和 音频过滤器 (-af, -filter:a的简写). 过滤器的内容写到双引号里面 (“) 并且可以使用逗号(,)连接。你可以使用任意数量的过滤器(我写了个etc代表更多的,这不是做一个真实的过滤器)。
过滤器设定的通常格式是:
5|1视频缩放
这是个简单过滤器,设定里只有 width 和 height:
我说过你可以使用数学运算来给值:
很明显,这个命令让输入的尺寸变成了输入尺寸(in_w, in_h)的1/2.
5|2视频裁剪
类似缩放,这个设定也有 width 和 height ,另外可以指定裁剪的原点(默认是视频的中心)
第二个命令裁剪原点是视频的中心点(因为我没有给x和y坐标),第一个命令会从左上角开始裁剪 (x=0:y=0).
这里也有一个使用数学计算的例子:
这会把视频裁剪剩下原大小的3/4/。
5|3视频旋转
你可以指定一个弧度,顺时针旋转视频。为了让计算简单一些,你可以给角度然后乘以 PI/180:
第一个命令将视频顺时针旋转90°,第二个则是上下颠倒了视频(翻转了180°)。
5|4音频声道重映射
有的时候,你的音频只有右耳可以听到声音,那么这个功能就很有用了。你可以让声音同时在左右声道出现:
这将右声道(1)同时映射到左(0)右(1)两个声道(左边的数字是输入,右边的数字是输出)。
5|5更改音量
你可以将音量大小乘以一个实数(可以是整数也可以不是),你只需要给出那个数大小就行了。
第一个将音量变为1.5倍,第二个则让音量变成了原来的1/4那么安静。
5|6技巧:更改播放速度
这里会介绍视频(不影响音频)和音频的过滤器。
视频
视频过滤器是 setpts (PTS = presentation time stamp). 这个参数以一种有趣的方式工作,因为我们修改的是PTS,所以较大的数值意味着较慢的播放速度,反之亦然:
第一个命令让播放速度加倍了,第二个则是让播放速度降低了一半。
音频
这里的过滤器是 atempo. 这里有个限制,它只接受 0.5(半速) 到 2 (倍速)之间的值。为了越过这个限制,你可以链式使用这个过滤器:
第一个命令让音频速度慢了1/4,第二个则是加速到原来的4(2*2)倍。
Note: 如果想在同一个命令中同时修改视频和音频的速度,你得查看一下 filtergraphs.
6|0后续资料
https://github.com/0voice/ffmpeg_develop_doc
__EOF__

本文链接:https://www.cnblogs.com/dongye95/p/17758105.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!