ffmpeg介绍及其常用指令说明

网友投稿 1178 2022-05-30

FFmpeg是一套视频处理和存储等的技术方案,关键词——“开源”、“免费”,“最主流的视频处理技术方案”,“各大厂商基本上都用”,“支持大部分系统”,“支持大部分的视频格式(插件方式)”。下面将分几部分介绍各方面都很强大的ffmpeg。

1.ffmpeg系列框架

1)官网:https://ffmpeg.org

2)定义(来自官网的权威解释)

3)工具

主要包含ffmpeg命令行工具(支持多种操作系统)

主要下载链接:https://ffmpeg.org/download.html

Windows链接:https://ffmpeg.zeranoe.com/builds/

macOS链接:https://evermeet.cx/ffmpeg/

Linux链接:wget http://ffmpeg.org/releases/ffmpeg***.tar.bz2(其他版本另说)

播放器:ffplay,这款也是相当神奇,后面将和另外一款强大的播放器vlc统一介绍。

视频分析:ffprobe,这款之前用得不多,但是一开始用,感觉好用到不行,也是强烈推荐。

4)各种库,libavutil 、libavcodec 等等。官网都有详细说明...

5)源码,那更不用说了吧...

2.ffmpeg命令行基本概念

官网指令详述链接:https://ffmpeg.org/ffmpeg.html

1)每个转码都可以描述为如下的过程:

视频源经过分流器,解码器,编码器,混流器,最终输出为处理后的视频文件。(下图为官网的流程图介绍)

当然不是每个视频处理都严格按照上述流程,有些可以略过。这里就要知道一些概念:

视频中的流信息:一般包括音频流、视频流,它们各有自己的编解码器,但是分流和混流器,在视频中有多个流时,就需要用到。

流复制处理:假设音频流或视频流直接采用copy的方式,则不需要进行编解码过程。常见的比如,acodec copy等。

2)指令行语法

ffmpeg [gl-opt] {[input-file-opt] -i input-url} ... {[output-file-opt] output-url} ...

3)指令行主要参数

下图是官网的,在ffmpeg的命令行工具中,输入-help 也能找到相似的说明。

4)ffmpeg其他参数和指令说明

万能ffmpeg -help,或者搜索引擎

3.ffmpeg命令行实操(针对Linux环境)

1)分析视频

这是我比较常用的方法了,简单粗暴,可以看有没有数据,还能解析出视频中的一些信息。

ffmpeg -i '文件or url',比如 ffmpeg -i a.mp4

针对某个文件,输出入下信息,从下图中可以得到:

这个视频是m3u8文件,解析的第一个ts文件

视频ts的url并不是它的真实存储位置,中间经过了跳转,是不是抓包的时候很懵逼,明白为啥了吧

duration为N/A,猜测直播,点播一般能将视频时长弄出来。不过现在没有m3u8的点播,不然也可以对比下。

bitrate,这个一般能够将码率解析出来,直播m3u8貌似也是无能为力

接下来看Stream*,一般可以看到有多个,包括视频和音频,但是这里只有Video,说明整个文件只有视频流,没有音频流。

这个视频流中,yuv是按4:2:0,分辨率是1920*1080。

2)常用的指令

涵盖了各方面,而且功能无比强大,基本上只有你没有想到的,没有它做不到的。而且你猜cdn or 存储厂商开放出来的视频处理的指令接口,他们是不是通过ffmpeg指令集进行操作。如果是的话,这些指令你也知道,是不是觉得自己很牛,哈哈。这里就举一些常用&有重大用途的

视频录制

ffmpeg –i rtsp://192.168.3.2:5256/src –vcodec copy out.mp4

上述是将直播源的数据,输出为out.mp4进行存储,如果不退出,则一直存。

视频转码(内容巨多)

视频封装

流复制

ffmpeg –i input.mp4 –vcodec copy -f ouput.mkv

当封装格式中可以音视频流部分通用的,则可以进行流复制。如果这里都是h264的格式,但是-vcodec copy改为 -vcodec libx264,则不是流复制,而是强制转码了。

非流复制

ffmpeg –i input.rmvb –vcodec libx264 -f ouput.m3u8

这里主要是因为两者之间的视频流兼容格式不相同。这里改封装的时候,其实也转码了。

这里只简单写了m3u8,但是由于m3u8是分片类型的格式,也有很多控制参数,比如设置分片的时间间隔。

视频码率转换

ffmpeg –i input.mp4 –vcodec libx264 -acodec libfaac –s 352*278  -b 2000k  -r 30 output.mp4

-vcodec 指定视频编码;-acodec 指定音频编码;-s 指定分辨率;-b 指定比特率;-r 指定帧率;封装格式按最后的来算。

还可以包含其他的参数,类型非常多,比如设置VBR,CBR的编码模式;设置B帧个数;设置GOP等

转码时,可以将多种因素都统一一起考虑和设置,也可以单独设置某项

视频水印

添加文字水印

ffmpeg –i input.mp4 -vf "drawtext=fontfile=simhei.ttf: text=‘川大爷’:x=12:y=12:fontsize=12:fontcolor=white:shadowy=5" output.mp4

-vf和-filter_complex其实都可以

注意,上面的操作可能执行不成功,报“No such filter: 'drawtext'”,因为编译时filter没有被编译进去,重新编译ffmpeg加上“--enable-libfreetype”后即可。

这里fontfile:字体类型

text:要添加的文字内容

x和y是需要展示的位置

fontsize:字体大小

fontcolor:字体color

图片水印

ffmpeg -i input.ts -i logo.png  -filter_complex  "overlay=20:20" output.mp4

将logo.png图片加到视频中形成水印,水印位置为

可以设置的类型很多,比如设置多个图片水印

可以设置水印出现的时间,比如只在前60s出现,或者每10s出现一次

可以设置图片水印的移动等。

以上可以通过文档进一步去了解。

去除水印

ffmpeg -i input.mp4 -vf delogo=x=0:y=0:w=120:h=120 output.mp4

输入如上指令后,出现了如下错误,是因为ffmpeg在编译过程中缺少了--delogo相关参数,重新configure下就好了,

./configure --prefix=/usr/local/ffmpeg --enable-gpl  --enable-nonfree    --enable-filter=delogo --enable-debug --disable-optimizations --enable-shared  --enable-pthreads,

之后再make clean&& make install 就可以了

视频截取

ffmpeg介绍及其常用指令说明

ffmpeg -i input.mp4 -ss 00:05:00 -t 00:22:00 output.mp4

-ss:开始截取的视频的位置(开始时间)

-t:需要截取的时长

裁剪视频(只需要视频的某块区域)

ffmpeg -i input.mp4 -strict -2 -vf crop=720:720:0:360 out.mp4

crop=width:height:x:y,其中 width 和 height 表示裁剪后的尺寸(输出大小),x:y 表示裁剪区域的左上角坐标

-strict -2 代表aac音频编码

视频截图

ffmpeg -i input.mp4 -ss 0.01 -t 0.001 -y -s 352x240   output.png

-ss 15.683 :将视频指向 0.01 秒开始

-y:强制覆盖文件(防止因为重名出错)

-t 0.001 :持续时间

-s:截取视频的图片的分辨率

注意-ss和-t最好一起,否则会概率性出错。同时需要根据视频的时长,再去设置-ss的位置,如果-ss设置超过,也会导致截图失败。

生成gif

ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x320 -pix_fmt rgb24 output.gif

-ss:开始时间

-t:时长

-s:输出分辨率

-pix_fmt:指定编码,这里用的是rgb24,想想看yuv呢,比如yuv420p

视频合并

音视频合并

ffmpeg -i input.mp4 -i input.aac -vcodec copy -acodec copy output.mp4

音频流处理

提取音频

ffmpeg -i input.mp4 -vn -y -acodec copy output.aac

-y 覆盖输出文件

-vn从视频中提取音频部分

剔除音频(静音)

ffmpeg -i input.mp4 -an output.mp4

视频流处理

提取视频

ffmpeg -i input.mp4 -vcodec copy -an  output.mp4

-an从视频中提取视频部分

字幕处理

添加字幕

ffmpeg -i input.mp4 -i input.srt -vcodec copy output3.mkv

字幕格式可以有.srt , .ass 文件等

视频倍速

音频倍速减半

ffmpeg -i input.mp3 -af atempo=0.5 output.mp3

音频两倍速

ffmpeg -i input.mp3 -af atempo=2 output.mp3

视频加速

ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4

视频倍速

ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output.mp4

当然,上面的指令还可以根据实际情况进行组合输出,ffmpeg很强大,想象力到应该大部分都能实现。

视频直播 视频

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深入理解 SAP Fiori Elements 工作原理系列之二:如何给 SAP Fiori Elements 应用添加自定义按
下一篇:纯干货!华为软件开发云编译构建之Maven
相关文章