ffmpeg介绍及其常用指令说明
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 -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很强大,想象力到应该大部分都能实现。
- 点赞
- 收藏
- 关注作者
评论(0)