FFmpeg是什么?

FFmpeg是一款开源软件,用于生成处理多媒体数据的各类库和程序。FFmpeg可以转码、处理视频和图片(调整视频、图片大小,去噪等)、打包、传输及播放视频。作为最受欢迎的视频和图像处理软件,它被来自各行各业的不同公司所广泛使用。

如何安装FFmpeg?

安装FFmpeg超级简单。如果你使用的是Windows系统,你可以在这里下载最新的FFmpeg可执行文件:

https://ottverse.com/ffmpeg-builds/

这个页面每周三都会更新最新的FFmpeg版本。

如果你使用的是Mac,那么你可以使用homebrew指令来安装。而Linux系统可以使用apt包管理器轻松安装。

如果你赶时间,可以使用homebrew这个Mac安装指令:

brew install ffmpeg
Linux则使用apt包管理器安装:

sudo apt install ffmpeg
当然,你也可以下载FFmpeg源代码,从零开始配置你想要使用的编解码器。而这么做,可以让你拥有一个适合自己的迷你FFmpeg版本。

如何使用FFmpeg?

1、获取视频信息,包括网络url

ffmpeg -i input.mp4
ffmpeg -i http://xxx.com/videofiles/xxxx.flv

2、分离音视频流

ffmpeg -i input_file -vcodec copy -an output_file_video // 视频流按原来的编码格式,禁用音频流。
ffmpeg -i input_file -acodec copy -vn output_file_audio // 音频流按原来的编码格式,禁用视频流。
//如果你想改变被分离出来的码流部分,那-codec就要附带ffmpeg所支持的编码格式别名。
//还有!具体输出的封装文件后缀名,需要与音频编码相符,譬如
//flv封装格式 支持 h.264,flashvideo + aac/mp3/ac3,然后需要理解的是mp3是一种音频编码格式: mpeg1--audio(layer1,2,3)
//mp4封装格式 支持 几乎所有的音视频码流的编码格式。

3、提取带有spspps的h264码流

ffmpeg -i input.mp4 -vcodec copy -an -bsf: h264_mp4toannexb -f h264 output.264 //提取 264码流,只能用ffplay -i 播放
ffmpeg -i input.mp4 -vcodec copy -an -bsf: h264_mp4toannexb -f mp4 output.mp4 //提取 264码流,封装成mp4,这样VLC等其他视频软件可以播放
// 注意   -bsf后面一定要带一个空格!
// h264格式是分为: VCL(avc1), NALU(annexb)
// VCL(avc1):MP4 文件,一个文件只有一个头部(sps, pps)
// NALU(annexb):一个nalu附带一个spspps头

4、mp4转换ts

ffmpeg -i ..\test\guide.mp4 -c copy -f mpegts ..\test\guide.ts       //MP4转换ts
ffmpeg -i ..\test\test.h264 -vcodec copy -f mpegts output.ts        //h264视频转ts视频流
ffmpeg -i ..\test\test.h264 -vcodec copy -f mp4 output.mp4         //h264视频转mp4

5、改变视频码率、帧率、gop、宽高;音频声道数、采样率

ffmpeg -i test.mp4 -b:v 640k output.flv       
ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv output.flv     
ffmpeg431 -i test.mp4    -s 176x144      -vcodec libx264      -r 25 -g 100      -acodec aac      -b 200k     -ac 1   //-ab 32   -ar 8000   -f avi  output.avi
//-s:指定宽高(widthxheight: 必须也必然是偶数,不是偶数也会变成偶数)
//-r :帧率 25,30,50,60
//-g:gop 图像组,多少帧有一个关键帧
//-b:码率,bps(bits per second)
//-ac:声道数
//-ar:采样率,每秒采样多少次(44.1KHz=44100,48KHz=48000,80KHz)
//-ab:采样位数

6、MP4格式的faststart转换

ffmpeg -i http://xxxx/154202543368.m3u8 -c copy -movflags +faststart  output.mp4    //m3u8转mp4
/// mp4的封装格式,头信息默认在文件的尾部,这样在解析MP4的时候要先读取整个文件才能正常解析,严重影响效率。
/// -movflags +faststart,把mp4文件的头信息放在文件的头部,这样就不影响效率,而且还能在正常使用中把网络流转写到本地的MP4格式

7、生成视频缩略图

ffmpeg -i input_ test.mp4 -r 1 -f image2 output_ image-%03d.jpeg
ffmpeg -i ..\test\guide.mp4 -ss 8 -t 4     -s 320*240 ..\test\t1_image.gif
//-r:1秒1帧图,-f:输出格式为image2,output_ image-%03d.jpeg格式化输出图片
//-ss:从8s开始时间,-t:持续4s(把-t的时间值控制在每帧显示的时间内,就是静态图,如果是大于每帧的显示时间,就是动图图),-s:输出大小320*240

8、缩略图合并成视频

ffmpeg -f image2 -t 30 -r 1   -i ..\test\output_image-%03d.jpeg ..\test\out_compjpeg.mp4
//-r: 1秒1帧图,-t:30张图,共持续30s

9、滤镜水印,静态图层overlay

//overlay技术又称视频叠加技术。overlay视频技术使用非常广泛,常见的例子有,电视屏幕右上角显示的电视台台标,以及画中画功能。画中画是指在一个大的视频播放窗口中还存在一个小播放窗口,两个窗口不同的视频内容同时播放。overlay技术中涉及两个窗口,通常把较大的窗口称作背景窗口,较小的窗口称作前景窗口,背景窗口或前景窗口里都可以播放视频或显示图片。FFmpeg中使用overlay滤镜可实现视频叠加效果。看例子
// -vf,video filter:简单过滤器
// 注意1:overlay的第三个参数,默认是0,如果1强制颜色空间为rgb,但是容易出问题,最好省略第三个参数
// 注意2: -vf,codec不能使用copy,需要重新指定编码格式
//右上角
ffmpeg -i guide.mp4 -vf "movie=logo.png[logo]; [in][logo] overlay=W-w:10:0 [out]" output.mp4
//中间
ffmpeg -i guide.mp4 -vf "movie=logo.png[logo]; [in][logo]overlay=W/2-w/2:H/2-h/2[out]" -vcodec libx264 -acodec aac output.mp4
//右下角
ffmpeg -i guide.mp4 -vf "movie=logo.png[logo]; [in][logo]overlay=W-w:H-h[out]" -vcodec libx264 -acodec aac output.mp4   -y

10、滤镜水印,输入文字/当前时间

ffmpeg -i guide.mp4 -vf "drawtext=fontfile=simhei.ttf:text='xsfdsx':x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2"  drawtext.mp4
//添加文字水印命令   drawtext=key=value:key=value:key=value

11、文字跑马灯效果

ffmpeg -i ..\test\guide.mp4 -vf  "drawtext=fontfile=simeittf:text='hello,':x=(mod(2*n\,w+tw)-tw):y=10:fontcolor=#FF6600:fontsize=60" -f mp4 -y ..\test\lr_lamp.mp4
ffmpeg -i ..\test\guide.mp4 -vf  "drawtext=fontfile=simeittf:text='hello,':x=w-t*w/10:y=10:fontcolor=#FF6600:fontsize=60" -f mp4 -y ..\test\lr_lamp.mp4

12、文字闪烁显示效果

ffmpeg -i ..\test\guide.mp4 -vf "drawtext=fontfile=simeittf:text='hello,':x=W-tw-50:y=10:enable=lt(mod(t\,5)\,2):fontcolor=#FF6600:fontsize=60" -f mp4 -y ..\test\flash.mp4
//lt:letter than <
//gt:greater than >
//enable:可用 可视化

13、视频旋转

//旋转有种做法,第一种是在配置元数据上添加属性,视频原始内容不产生任何的改变,转换效率高,但是解码渲染效率有所降低。
// -90 顺时针
ffmpeg -i ..\test\guide.mp4 -metadata:s:v rotate="-90" -codec copy ..\test\meta_rotate_-90.mp4
// 90 逆时针
ffmpeg -i ..\test\guide.mp4 -metadata:s:v rotate="90" -codec copy ..\test\meta_rotate_90.mp4

14、视频提取图片注意事项

13、视频旋转

ffmpeg -i test.avi -r 1 -f image2 image- %3d.jpeg
// -r 1         每秒一帧,提取视频图像。
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi
// -ss 开始时间,-t 持续时间
// 从10s 处开始剪切,持续15秒(此方法有时候会遇到视频第一帧黑屏, 就是未播放时候的封面是黑色的,原因是未定位到关键帧1帧)
ffmpeg -i test.mp4 -ss 10 -t 15 -codec copy cut.mp4
// 从10s处开始剪切,持续15秒(此方法为优化后的方法,此剪切视频的方法可以解决第一帧黑屏问题,但是可能切割的时间落点稍稍的有一丢丢的不准确,但是应该可以落在误差范围之内)
ffmpeg -ss 10 -t 15 -i test.mp4 -codec copy cut.mp4
// 注意事项:如果 视频文件很大,2GB, duration: 02:00:00
//前: -i xxx.mp4 -ss 01:10:05 -t 00:15:20,大视频会很慢,因为需要解码整个视频,然后定位时间点
//后: -ss 01:10:05 -t 00:15:20 -i xxx.mp4,较快,因为是seekto

15、音视频倒放,加速减速播放

// 视频倒放 音频不变
ffmpeg -i ..\test\guide.mp4 -vf reverse ..\test\guide_v_reverse.mp4
// 音频倒放 视频不变
ffmpeg -i ..\test\guide.mp4 -c:v copy -af areverse ..\test\guide_a_reverse.mp4
// 音视频同时倒放    -preset superfast 快速编码,视频质量有所下降
ffmpeg -i ..\test\guide.mp4 -vf reverse -af areverse -preset superfast ..\test\guide_av_reverse.mp4
// 减速播放,pts增加为原来的2倍,声音为原来的0.5倍速
ffmpeg -i ..\test\guide.mp4 -vf setpts=PTS*2 -af atempo=0.5 ..\test\guide_speed0.5.mp4
// 加速播放,pts缩短为原来的1/2,声音为原来的2倍速
ffmpeg -i ..\test\guide.mp4 -vf setpts=PTS*0.5 -af atempo=2 ..\test\guide_speed2.mp4

16、视频拼接

//以ts流为媒介,因为ts流是可以concate的,先把mp4封装成ts,然后再用concate指令合并ts流,最后再把ts流拼接为mp4。
// 内容复习,-vbsf h264_mp4toannexb,在I帧前都带上sps和pps
ffmpeg -i 10s.mp4 -vcodec libx264 -acodec aac -vbsf h264_mp4toannexb 10s.ts
ffmpeg -i guide.mp4 -vcodec libx264 -acodec aac -vbsf h264_mp4toannexb guide.ts
ffmpeg -i "concat:..\test\10s.ts|..\test\guide.ts" -acodec copy -vcodec copy -absf aac_adtstoasc ..\test\concat_10s_guide.mp4
//将AAC码流转换成一些其他格式时,需要特殊配置码流滤波器(-absf aac_adtstoasc)
//将AAC编码器编码后的原始码流(ADTS头 + ES流)封装为MP4或者FLV或者MOV等格式时,需要先将ADTS头转换为MPEG-4 AudioSpecficConfig (将音频相关编解码参数提取出来),并将原始码流中的ADTS头去掉(只剩下ES流)

17、视音频合并

//两个视频的合并(注意参数hstack 代表是横向合并,也就是左右合并,横向合并的形象类比为“川”; 如果是竖向合并,也就是上下合并,用参数vstack,竖向或者纵向合并的形象类比为“三”)
//注意:经过此命令处理后的视频output.mp4只会保留第一个视频input1.mp4的音频 
ffmpeg -i input1.mp4 -i input2.mp4 -lavfi hstack output.mp4
ffmpeg -i input1.mp4 -i input2.mp4 -lavfi vstack output.mp4
//把音频文件mp3 合并到视频文件mp4中去(就是为原视频加背景音乐)
ffmpeg -i video.mp4 -i bg_music.mp3 -c:v copy -c:a aac  -strict experimental    merge.mp4

18、视频区域裁剪

ffmpeg -i ..\test\guide.mp4 -vf crop=400:400:0:0 -y  ..\test\guide_crop.mp4
//指令crop的参数格式为w:h:x:y;w、h为输出视频的宽和高,x、y标记输入视频中的某点,将该点作为基准点,向右下进行裁剪得到输出视频。如果xy不写的话,默认居中剪切。

19、视频缩放

ffmpeg -i ..\test\guide.mp4 -vf scale=iw*2:ih*2     ..\test\guide_scale2.mp4   //  将视频宽高度放大一倍
ffmpeg -i ..\test\guide.mp4 -vf scale=iw*0.5:ih*0.5     ..\test\guide_scale0.5.mp4   //  将视频宽高缩小一半