FFmpeg快速入门

一、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:

 

猜你喜欢

转载自blog.csdn.net/King_weng/article/details/108648257