ffmpeg介绍及其常用指令说明【转】
1.概述
ffmpeg是一套视频处理和存储等的技术方案,关键词——“开源”、“免费”,“最主流的视频处理技术方案”,“各大厂商基本上都用”,“支持大部分系统”,“支持大部分的视频格式(插件方式)”。下面将分几部分介绍各方面都很牛的ffmpeg。
2.ffmpeg系列框架
2.1 官网
2.2 定义
(来自官网的权威解释)
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,这款之前用得不多,但是一开始用,感觉好用到不行,也是强烈推荐。
2.4 各种库
libavutil 、libavcodec 等等。官网都有详细说明…
2.5 源码
那更不用说了吧…
3.ffmpeg命令行基本概念
官网指令详述链接:https://ffmpeg.org/ffmpeg.html
3.1 转码的流程
每个转码都可以描述为如下的过程:
视频源经过分流器,解码器,编码器,混流器,最终输出为处理后的视频文件。(下图为官网的流程图介绍)
当然不是每个视频处理都严格按照上述流程,有些可以略过。这里就要知道一些概念:
- 视频中的流信息:一般包括音频流、视频流,它们各有自己的编解码器,但是分流和混流器,在视频中有多个流时,就需要用到。
- 流复制处理:假设音频流或视频流直接采用copy的方式,则不需要进行编解码过程。常见的比如,acodec copy等。
3.2 指令行语法
ffmpeg [gl-opt] {[input-file-opt] -i input-url} ... {[output-file-opt] output-url} ...
3.3 指令行主要参数
下图是官网的,在ffmpeg的命令行工具中,输入-help 也能找到相似的说明。
3.4 ffmpeg其他参数和指令说明
万能ffmpeg -help,或者搜索引擎
4.ffmpeg命令行实操
(针对Linux环境)
4.1 分析视频
这是我比较常用的方法了,简单粗暴,可以看有没有数据,还能解析出视频中的一些信息。
- ffmpeg -i ‘文件or url’,比如 ffmpeg -i a.mp4
- 针对某个文件,输出入下信息,从下图中可以得到:
这个视频是m3u8文件,解析的第一个ts文件
1)视频ts的url并不是它的真实存储位置,中间经过了跳转,是不是抓包的时候很懵逼,明白为啥了吧
2)duration为N/A,猜测直播,点播一般能将视频时长弄出来。不过现在没有m3u8的点播,不然也可以对比下。
3)bitrate,这个一般能够将码率解析出来,直播m3u8貌似也是无能为力
4)接下来看Stream*,一般可以看到有多个,包括视频和音频,但是这里只有Video,说明整个文件只有视频流,没有音频流。
5)这个视频流中,yuv是按4:2:0,分辨率是1920*1080。
4.2 常用的指令
涵盖了各方面,而且功能无比强大,基本上只有你没有想到的,没有它做不到的。而且你猜cdn or 存储厂商开放出来的视频处理的指令接口,他们是不是通过ffmpeg指令集进行操作。如果是的话,这些指令你也知道,是不是觉得自己很牛,哈哈。这里就举一些常用&有重大用途的
4.2.1 视频录制
ffmpeg –i rtsp://192.168.3.2:5256/src –vcodec copy out.mp4
上述是将直播源的数据,输出为out.mp4进行存储,如果不退出,则一直存。
4.2.2 视频转码(内容巨多)
4.2.2.1 视频封装
1) 流复制
ffmpeg –i input.mp4 –vcodec copy -f ouput.mkv
- 当封装格式中可以音视频流部分通用的,则可以进行流复制。如果这里都是h264的格式,但是-vcodec copy改为 -vcodec libx264,则不是流复制,而是强制转码了。
2) 非流复制
ffmpeg –i input.rmvb –vcodec libx264 -f ouput.m3u8
- 这里主要是因为两者之间的视频流兼容格式不相同。这里改封装的时候,其实也转码了。
- 这里只简单写了m3u8,但是由于m3u8是分片类型的格式,也有很多控制参数,比如设置分片的时间间隔。
4.2.2.2 视频码率转换
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等
- 转码时,可以将多种因素都统一一起考虑和设置,也可以单独设置某项
4.2.3 视频水印
1)添加文字水印
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:字体颜色
2)图片水印
ffmpeg -i input.ts -i logo.png -filter_complex "overlay=20:20" output.mp4
- 将logo.png图片加到视频中形成水印,水印位置为
- 可以设置的类型很多,比如设置多个图片水印
- 可以设置水印出现的时间,比如只在前60s出现,或者每10s出现一次
- 可以设置图片水印的移动等。
- 以上可以通过文档进一步去了解。
4.2.4 去除水印
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 就可以了
4.2.5 视频截取
ffmpeg -i input.mp4 -ss 00:05:00 -t 00:22:00 output.mp4
- -ss:开始截取的视频的位置(开始时间)
- -t:需要截取的时长
4.2.6 裁剪视频(只需要视频的某块区域)
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音频编码
4.2.7 视频截图
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设置超过,也会导致截图失败。
4.2.8 生成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
4.2.9 视频合并
1)音视频合并
ffmpeg -i input.mp4 -i input.aac -vcodec copy -acodec copy output.mp4
2)音频流处理
*a 提取音频
ffmpeg -i input.mp4 -vn -y -acodec copy output.aac
- -y 覆盖输出文件
- -vn从视频中提取音频部分
*b 剔除音频(静音)
ffmpeg -i input.mp4 -an output.mp4
4.2.10 视频流处理
1)提取视频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
- -an从视频中提取视频部分
4.2.11 字幕处理
1)添加字幕
ffmpeg -i input.mp4 -i input.srt -vcodec copy output3.mkv
- 字幕格式可以有.srt , .ass 文件等
4.2.12 视频倍速
1)音频倍速减半
ffmpeg -i input.mp3 -af atempo=0.5 output.mp3
2)音频两倍速
ffmpeg -i input.mp3 -af atempo=2 output.mp3
3)视频倍速减半
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4
4)视频2倍速
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output.mp4
当然,上面的指令还可以根据实际情况进行组合输出,ffmpeg很强大,想象力到应该大部分都能实现。
【说明】
文章转自,华为云社区,作者Higeeon,相关版权解释权归原作者所有。https://bbs.huaweicloud.com/blogs/204dd19b81bc11e9b759fa163e330718