ffmpeg的基本用法(上)

简介: ffmpeg的基本用法之上篇

一、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...


1.png


下载最新的带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


2.png


不重启使Windows环境变量生效,cmd,输入 set path = D:\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\bin


重启命令提示符终端,测试效果: cmd,输入 ffmpeg -version得到如下效果即为成功安装


3.png


二、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


4.png


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


目录
相关文章
|
编解码 Linux 开发工具
ffmpeg的基本用法(下)
ffmpeg的基本用法的下篇来喽!
1040 0
|
编解码 API 数据安全/隐私保护
FFmpeg中overlay滤镜用法-水印及画中画
overlay 技术又称视频叠加技术。overlay 视频技术使用非常广泛,常见的例子有,电视屏幕右上角显示的电视台台标,以及画中画功能。画中画是指在一个大的视频播放窗口中还存在一个小播放窗口,两个窗口不同的视频内容同时播放。
1893 0
FFmpeg中overlay滤镜用法-水印及画中画
|
Shell API 内存技术
FFmpeg原始帧处理-滤镜API用法详解
在 FFmpeg 中,滤镜(filter)处理的是未压缩的原始音视频数据(RGB/YUV视频帧,PCM音频帧等)。一个滤镜的输出可以连接到另一个滤镜的输入,多个滤镜可以连接起来,构成滤镜链/滤镜图,各种滤镜的组合为 FFmpeg 提供了丰富的音视频处理功能。
620 0
FFmpeg原始帧处理-滤镜API用法详解
ffmpeg一些filter用法、以及一些功能命令
1、加字幕          命令:ffmpeg -i  -filter_complex subtitles=filename=-y          说明:利用libass来为视频嵌入字幕,字幕是直接嵌入到视频里的硬字幕。
1620 0
|
数据安全/隐私保护 Windows
ffmpeg用法(心得体会还有你见过的用法)
ffmpeg的常用用法很多,我这里提供的用法有可能有许多地方是你没见过的。 一、ffmpeg合并视频 我经常需要切割再把一些零碎的视频给拼接起来,这样可以省许多磁盘空间。其实用mencoder挺不错的,至少合并的参数极简单。
1993 0
|
编解码 vr&ar C语言
FFmpeg 基本用法--此文转载,作为笔记
v  容器(Container) v  容器就是一种文件(封装)格式,比如flv、mkv、ts、mp4、rmvb、avi等。包含下面5种流以及文件头信息。 v  流(Stream) v  是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。
1753 0
|
编解码 容器
FFmpeg 基本用法
FFmpeg FFmpeg 基本用法 本课要解决的问题 1.FFmpeg的转码流程是什么? 2.常见的视频格式包含哪些内容吗? 3.如何把这些内容从视频文件中抽取出来? 4.如何从一种格式转换为另一种格式? 5.如何放大和缩小视频? 6.如何旋转,翻转,填充,裁剪,模糊,锐化视频? 7.如何给视频加logo,删除logo? 8.如何给视频加文本,动态文本? 9.如何处理图片? 10.如何录像,添加动态logo,截图,马赛克视频? 第一部分 基础 术语 容器(Container) 容器就是一种文件格式,比如flv,mkv等。
1537 0
ffmpeg中swscale 的用法
移植ffmpeg过程中,遇到swscale的用法问题,所以查到这篇文章。文章虽然已经过去很长时间,但是还有颇多可以借鉴之处。谢谢“咕咕鐘"。          转自:http://guguclock.blogspot.com/2009/12/ffmpeg-swscale.html          如果想將某個PixelFormat轉換至另一個PixelFormat,例如,將YUV420P轉換成YUYV422,或是想變換圖的大小,都可以使用swscale達成。
1308 0
|
1月前
|
开发工具
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(三)
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(三)
46 0