一、FFMpeg
1、FFMPEG简介
(1)MPEG
FFMPEG 全称Fast Forward MPEG,MPEG系列标准是由ISO/IEC制定的,主要应用于视频存储(DVD)、广播电视、因特网或无线网上的流媒体。ITU-T与ISO/IEC是制定视频编码标准的两大组织,ITU-T的标准包括H.261、H.263、H.264,两个组织也共同制定了一些标准,H.262标准等同于MPEG-2的视频编码标准,而最常用的H.264标准则被纳入MPEG-4的第10部分也叫AVC编码。
(2)FFMPEG
特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件.还能转换数字音频、视频,并能将其转化为流,能在Linux、Windows、Mac OS X三大平台使用,采用LGPL或GPL许可证。
(3)主要功能
视频采集功能、视频格式转换、视频抓图、给视频加水印,视频转码,推流
(4)FF系列其他工具:
- FFPlay:不仅仅是播放器,也可以作为音视频数据图形化分析工具,ffplay也可以看到视频图像的运动估计方向、音视频波形等,同时也是测试ffmpeg的codec引擎、format引擎、filter引擎工具,还可以进行可视化的媒体参数分析
- FFProbe:查看多媒体文件详细信息
- FFServer:轻量流媒体,负责响应客户端的流媒体请求,把流媒体数据发送给客户端
2、FFMPEEG命令
(1)容器转换(格式转换)
ffmpeg -i input.avi (-acodec copy -vcodec copy) output.mp4
- -acodec copy -vcodec copy:拷贝音视频,解码和编码步骤省略,它可用于更改容器格式或修改容器级元数据,由于没有解码或编码,它非常快,并且没有质量损失
容器:容器就是一种文件格式,比如flv,mkv等。封装了流以及文件头信息
注:
- 流(Stream) :视频数据信息的传输方式,包含5种流:音频,视频,字幕,附件,数据
- 帧(Frame):视频帧代表一幅静止的图像,分为I帧,P帧,B帧。音频帧:一个AAC原始帧包含某段时间内1024个采样点相关数据,音频帧的播放时间 = 一个AAC帧对应的采样样本的个数 / 采样频率(单位为s)
- 编解码器(Codec):是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)
- 复用/解复用(mux/demux):复用:把不同的流按照某种容器的规则放入容器
(2)转码
ffmpeg -i input.mp4 -acodec copy -vcodec h264 out.mp4
- -i 后面是输入文件名。-acodec 后面是输出的音频编码格式,copy表示不转码直接拷贝,-vcodec 后面是要输出的视频编码格式。
- 注:
- -c:v与参数 -vcodec一样,表示视频编码器。c 是 codec 的缩写,v 是video的缩写
- h264(AVC MPEG-4 part-10) 最佳,但 Windows 系统默认不安装,可以单独安装libx264*
ffmpeg -i input.mp4 -s 640x480 -b 500k -vcodec h264 -r 29.97 -acodec libfaac -ab 48k -ac 2 out.mp4
附加选项:-r 指定帧率,-s 指定分辨率,-b 指定比特率;于此同时可以对声道进行转码,-acodec 指定音频编码,-ab 指定音频比特率,-ac 指定声道数,-g 指定GOP大小,海康摄像头默认配置50,ffmpeg默认12
修改视频分辨率:
ffmpeg -i input.avi -vf scale=320:240 output.avi
(3)剪切
用 -ss 和 -t 选项, 从第 30 秒开始,向后截取 10 秒的视频,并保存:
ffmpeg -i input.mp4 -ss 00:00:30.0 -c copy -t 00:00:10.0 output.mp4
ffmpeg 为了加速,会使用关键帧技术, 所以有时剪切出来的结果在起止时间上未必准确。 通常来说,把 -ss 选项放在 -i 之前,会使用关键帧技术; 把 -ss 选项放在 -i 之后,则不使用关键帧技术。 如果要使用关键帧技术又要保留时间戳,可以加上 -copyts
ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4
获取视频封面(随机时间抽一帧,可以用于视频网站的视频缩略图):
ffmpeg -ss 00:00:10 -i input.mp4 -f image2 -y cover.jpg
(4)录制
把/dev/fb0设备的framebuffer显示图像录制为视频:
ffmpeg -f fbdev -framerate 10 -i /dev/fb0 out.avi
把/dev/fb0设备的framebuffer显示图像录制一帧,编码为图片:
ffmpeg -f fbdev -framerate 1 -i /dev/fb0 -frames:v 1 screenshot.jpeg
(5)流抽取&流过滤
音频流抽取:
ffmpeg -i input.mp4 -vcodec copy -vn out.aac
- -vn: v 代表视频,n 代表 no 也就是无视频的意思
视频流抽取:
ffmpeg -i input.mp4 -vcodec copy -an out.h264
- -an: a 代表视频,n 代表 no 也就是无视频的意思
- -sn :字幕流
- -dn :数据流
(6)选择媒体流
一些多媒体容器比如AVI,mkv,mp4等,可以包含不同种类的多个流
语法:
-map file_number[:stream_type][:stream_number]
- -map 0 选择第一个文件的所有流
- -map i:v 从文件序号i(index)中获取所有视频流, -map i:a 获取所有音频流,-map i:s 获取所有字幕流等等
去第一个文件的视频流,第二个文件的音频流:
ffmpeg -i first.mp4 -i second.mp4 -map:v:0 -map:a:1? output.mp4
例:
- Input #0:代表第一个输入文件
- metadata:元数据
- duration:文件时长
(7)流合并
FFmpeg concat 协议:
对于MPEG 编码器(H.264、DivX、XviD、MPEG4、MPEG2、AAC、MP2、MP3 等),可以包装进 TS 格式的容器再合并
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts
ffmpeg -i input3.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input3.ts
ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy -bsf:a aac_adtstoasc -movflags +faststart output.mp4
- -bsf 位流过滤器
h264有两种封装,一种是annexb模式,传统模式,有startcode(0x000001或0x0000001)分割NALU,在mpegts流媒体中使用,vlc里打开编码器信息中显示h264;一种是AVCC模式,一般用mp4、mkv、flv容器封装,以长度信息分割NALU, vlc里打开编码器信息中显示avc1
FFmpeg concat 分离器:
先创建一个文本文件filelist.txt,filelist.txt内容填充如下:
file 'input1.mkv'
file 'input2.mkv'
file 'input3.mkv'
执行合并指令:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mkv
- -safe 0 : 出现Unsafe file name ‘./00000003668000000.mp4’。有些媒体需要先分离视频和音频,合并完成后再封装回去
(8)过滤器(Filter)
filter的意思是被编码到输出文件之前用来修改输入文件内容的工具。
- 视频过滤器 -vf ,音频过滤器 -af
(9)分辨率调整
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
- scale=960:-1,缩放滤镜在输出时保持原始的宽高比
(10)视频旋转(旋转视频的方案可以考虑在播放时进行,不占服务器资源)
顺时针旋转90度:
ffmpeg -i input.mp4 -vf transpose=1 output.mp4
左右水平翻转:
ffmpeg -i input.mp4 -vf hflip output.mp4 垂直翻转-vf vflip
(11)画面合并
ffmpeg -i 流地址 -i 流地址 -filter_complex "
[1:v]scale=w=350:h=200:force_original_aspect_ratio=decrease
[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out];amix=inputs=2:duration=first:dropout_transition=3" -map "
[out]" -f flv 流地址
注:修改采样率:
ffmpeg -i input.mp4 -ac 1 -ar 4800 -y output.mp4
- -ac 1:设置声道数为1
- -ar 4800:设置采样率为4800Hz
(12)过滤器链(Filterchain)
用逗号分隔一组filter,顺时针旋转90度并水平翻转:
ffplay -i input.mp4 -vf transpose=1,hflip
(13)过滤器图(Filtergraph)
第一步: 源视频宽度扩大两倍。
ffmpeg -i input.mp4 -t 10 -vf pad=2*iw output1.mp4
第二步:源视频水平翻转
ffmpeg -i input.mp4 -t 10 -vf hflip output2.mp4
第三步:水平翻转视频覆盖output.mp4
ffmpeg -i output1.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4
上面三步简化为:
ffmpeg -i input.mp4 -vf “split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w” output.mp4
注意:此处一定加分号
- F1: split过滤器创建两个输入文件的拷贝并标记为[a],[b]
- F2: [a]作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到[1].
- F3: [b]作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到[2].
- F4: 用overlay过滤器把 [2]覆盖到[1]的旁边.
(14)水印
(a)添加水印
ffmpeg -i input.mp4 -i unicom_logo.jpg -filter_complex overlay output.mp4
ffmpeg -i input.mp4 -vf "movie=logo.jpg[logo]; [in][logo] overlay=10:10 [out]" output.mp4
- overlay:水印参数
注:该方法实际上也可在视频中添加视频。
(b)去除水印
ffmpeg -i input.mp4 -vf”delogo=x=10:y=10:w=500:y=300:show=1” -c:a copy output.mp4
- delogo过滤器。 语法:-vf delogo=x:y:w:h[:t][:show] x:y 离左上角的坐标; w:h logo的宽和高; t: 矩形边缘的厚度默认值4; show:若设置为1有一个绿色的矩形,默认值0
注:去水印的时候要注意x、y、w、h
(15)码率控制
码率:bitrate = file size / duration 比如一个文件20.8M,时长1分钟,那么,码率就是: biterate = 20.8M bit/60s = 20.810241024*8 bit/60s= 2831Kbps 一般音频的码率只有固定几种,比如是128Kbps, 那么,video的就是 video biterate = 2831Kbps -128Kbps = 2703Kbps
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
- -minrate -b:v -maxrate -b:v主要是控制平均码率
- -bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动
(16)推流
(a)海康设备推流
ffmpeg -i "rtsp://admin:[email protected]:554/Streaming/Channels/101" -vcodec copy -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv rtmp://10.206.142.12:59984/device/ streamid
(b)大华设备推流
ffmpeg -i "rtsp://admin:12345 @192.168.172.76:554/cam/realmonitor?channel=1&subtype=0" -vcodec copy -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv rtmp://10.206.142.12:59984/device/streamid
3、ffmpeg查询命令
- 可用的bit流 :ffmpeg –bsfs
- 可用的编解码器:ffmpeg –codecs
- 可用的解码器:ffmpeg –decoders
- 可用的编码器:ffmpeg –encoders
- 可用的过滤器:ffmpeg –filters
- 可用的视频格式:ffmpeg –formats
- 可用的声道布局:ffmpeg –layouts
- 可用的license:ffmpeg –L
- 可用的像素格式:ffmpeg –pix_fmts
- 可用的协议:ffmpeg -protocols
二、FFProbe
1、FFprobe简介
FFprobe主要是用来查看多媒体文件详细信息。
2、实例
(1)输出每路流最详细的信息
ffprobe -print_format json -show_streams [media]
- media:要查询的多媒体文件
(2)输出帧信息
ffprobe -show_frames [media]
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 [video.mp4]
(3)输出包信息
ffprobe -show_packets [video.mp4]
三、FFPlay
1、FFPlay简介
FFPlay不仅仅是播放器,也可以作为音视频数据图形化分析工具,ffplay也可以看到视频图像的运动估计方向、音视频波形等,同时也是测试ffmpeg的codec引擎、format引擎、filter引擎工具,还可以进行可视化的媒体参数分析
2、实例
ffplay -window_title "直播测试" -x 1920 -y 1080
rtsp://admin:[email protected]:554/cam/realmonitor?channel=1subtype=0
四、FFServer
1、FFServer简介
轻量流媒体,负责响应客户端的流媒体请求,把流媒体数据发送给客户端。
2、实例
(1)创建配置文件 server.conf
(a)配置服务器端口
Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 30000
CustomLog -
NoDaemon
#NoDefaults
(b)配置ffm文件
<Feed feed1.ffm>
File /tmp/feed1.ffm #启动ffserver后会在/tmp目录下生成feed1.ffm文件
FileMaxSize 100M
</Feed>
(c)配置流
Format flv
videoFrameRate 25
videoSize 1920x1080
videoGopSize 200
videoBitRate 4096
</Stream>
(d)配置stat.html
<Stream stat.html>
Format status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
ACL allow 10.206.146.50 10.206.146.100
</Stream>
(b)启动ffserver
ffserver -f ffserver.conf
推流:
ffmpeg -i rtsp://admin:[email protected]:554/cam/realmonitor?channel=1subtype=0 -vcodec libx264 -b:v 500000 -r 25.00 -s 1920x1080 -aspect 1920:1080 -threads 12 http://localhost:8090/feed1.ffm
播放地址:
ffplay http://10.206.142.12:8090/test1.flv
ffserver status: