ffmpeg的基本用法

news2024/11/26 0:51:58

title: ffmpeg的基本用法

categories:[ffmpeg]

tags:[音视频编程]

一、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/FFmpeg-Builds/releases

下载最新的带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 也可以进行相反的动作:把多个文件合在一起。

为了实现这一点,你得用自己顺手的编辑器来创建一个文本文件。

因为我喜欢使用终端,所以这里我用了 touchvim. 文件名无关紧要,这里我用 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上同时是使用 ALSApulseaudio 来处理声音的。 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. 视频缩放

这是个简单过滤器,设定里只有 widthheight:

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. 视频裁剪

类似缩放,这个设定也有 widthheight ,另外可以指定裁剪的原点(默认是视频的中心)

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那么安静。

技巧:更改播放速度

这里会介绍视频(不影响音频)和音频的过滤器。

  1. 视频

视频过滤器是 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.

作者:hackett

★文末名片可以免费领取音视频开发学习资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正大期货数据整合 新鲜事简单报

本周观察重点: 🔹美国11月CPI数据昨晚公布为7.1%,低于市场预期7.3%,较于前值7.7%大幅回落,随通膨回落,静待联准会未来货币政策方向。 12/15 (四) 美国、香港、欧洲、英国、台湾央行12月利率决策会议 12/16 (六) 日本、…

基于java+springboot+mybatis+vue+mysql的小学家校一体作业帮

项目介绍 本系统采用java语言开发,后端采用springboot框架,前端采用vue技术,数据库采用mysql进行数据存储。系统功能如下: 前台: 首页、微社区、试卷、公告通知、个人中心、后台管理 后台: 首页、个人中…

SpringCloud02

1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案&#xff…

技术分享 | 软件项目管理与跨部门沟通协作

项目管理是在项目活动中运用知识、技能、工具和方法,以便达到项目要求。 软件项目管理有其特定的对象、范围和活动,着重关注成本、进度、风险和质量的管理,还需要协调开发团队和客户的关系,协调内部各个团队之间的关系&#xff0…

怎么把pdf格式转成word文档?如何将 PDF 转换为 Word

怎么把pdf格式转成word文档?PDF是运用得很广泛地的办公文档,但是不能编辑,为了方便编辑,需要将PDF转换为word,那么,如何将 PDF 转换为 Word,下面,易我小编会讲解实用的pdf转word的操…

基于VBA实现电缆结构自动出图(二) —— 单芯线

大家敢相信吗,原来VBA竟然可以实现电缆结构自动出图,换句话说,只要输入数据,VBA会自动将电缆的结构画出来,同时还可以渲染,结果竟然不输画图软件,真真让我刮目相看。这里我就不过多介绍VBA了&am…

传奇登录器列表显示不连接

传奇登录器列表显示不连接 我们打开登录器后列表显示不连接怎么办? 图中有打码部分望读者理解(平台gz) 以下我们大家说下几种列表显示不连接的几种情况 第一种:列表格式错误 在我们开区的位置默认是127.0.0.1 端口默认7000 如果…

Django captcha验证码应用【亲测可用】

1、下载captcha安装包: pip install django-simple-captcha pip3 install pillow -i Simple Index 2、在settings的INSTALLED_APPS添加: captcha, 3、在控制台执行: 生成迁移文件:python3 manage.py makemigrations 迁移文件…

数据流标准差计算方法-不用事先计算均值

数据流标准差计算方法-不用事先计算均值 挑战 标准差(Standard Deviation)是误差有效值的估计,在信号处理里面代表偏差有效值。公式定义需要事先知道均值(引自百度百科): 数据流进来,你事先不知道均值,…

【云原生】k8s中kubectl陈述式资源管理

内容预知 1.k8s陈述资源管理方法的说明 1.1 管理k8s核心资源的三种基本方法 陈述式资源管理方法 声明式资源管理方法 GUI式资源管理方法 1.2 kubectl命令行工具 的说明 2.k8s集群中的基本信息查看 2.1 k8s中基本管理信息的查看 (1)查看版本信息 …

移动端内webview页面调试技巧

前言 长假七天乐确实很爽,只是疫情不稳定,还是呆在家里安全些, 在这宅在家的七天里,何不找点有趣的小demo耍耍 本期教大家制作一个 能播放M3U8直播源的在线电视台网站, 既能学到知识技术,又可以方便在家…

Vue之iconfont

iconfont的使用1.iconfont的使用2.多个iconfont如何做到不冲突1.iconfont的使用 1.打开iconfont官网链接 链接 2.搜索想要的图标,加入购物车 3.点击最上面一行购物车图标,添加至项目 (如果没有项目,请先到 资源管理->我的项目…

B2:Unity制作Moba类游戏——聊天系统

一场游戏对局中,和队友进行友好的有礼貌的有效的沟通可以极大提升对局胜率。在LOL国服,打字和队友聊天沟通战术是非常常见的行为: 语言的力量是无限的,甚至可以和外国小伙伴效沟通战术: 聊天系统制作起来非常简单&…

jQuery图片批量上传插件源码,支持批量上传、预览、删除、放大,可配置上传数量、上传大小、追加方式,含详细使用文档

jQuery图片批量上传插件源码,支持批量上传、预览、删除、放大,可配置上传数量、上传大小、追加方式,含详细使用文档 程序包内含使用Demo 完整程序源代码:jQuery图片批量上传插件源码 上传前 上传后 使用方法 1、先引入jquer…

linux搭建nexus私服仓库并简单使用

linux搭建nexus私服仓库并简单使用1、linux搭建nexus私服仓库1.1、下载安装包1.2、linux安装1.3、启动和关闭1.4、登录控制台1.5、账号与密码2、创建自己的私服仓库3、上传 jar 包4、具体项目引入私服仓库1、linux搭建nexus私服仓库 1.1、下载安装包 下载nexus包,这…

用Python写一个新年倒计时

❤️‍🔥前言: 春回大地,万象更新!春在招手,朋友们,我们一起互相祝愿吧!一年更比一年好。时光苒,岁月如梭。踏着新年欢快的钟声,我们又迎来了这个期待已久的日子过去的一年,我们有泪…

m基于PSO粒子群优化的柔性制造系统AGV调度模型matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 在PSO中,群中的每个粒子表示为向量。在投资组合优化的背景下,这是一个权重向量,表示每个资产的分配资本。矢量转换为多维搜索空间中的位置。每个粒子也会记住它…

Word控件Spire.Doc 【超链接】教程(5):使用 C# 更改颜色或从 Word 中的超链接中删除下划线

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

STM32 ~ 定时器

定时器的基本框图: 不管是做PWM输出、定时中断还是输入捕获都肯定要搞清楚CK_INT 从哪里来,频率是多少?才能正确使用定时器。时钟肯定是来自时钟树,那我们就要去Reference manual里找找: 时钟源确实可以找到&#xf…

奈雪收购乐乐茶,茶饮品牌开启整合之路

近日,奈雪的茶以5.25亿元收购了乐乐茶43.64%的股权,成为其第一大股东。这是今年以来新式茶饮品牌最大的一笔投资,也使得奈雪的股价一路飙涨,五日涨幅超过15%,创下年内新高。 据《2022年中国新式茶饮研究报告》显示&…