一些global参数,各种功能都可以用
-ss 8 就是从第8秒开始读取文件进行后续操作
-t 10 就是截取10秒的数据
-vn :disable video
-an: disable audio
一.转码和转封装:
ffmpeg -i ingput.rmvb -vcodec mpeg4 -b:v 200k -r 15 -s 640x480 -an -f mp4 -movflags faststart -y output.mp4
-vf scale=iw*0.9:ih*0.9
来实现缩放,vf就是指定video filter,这里利用scale filter来实现。注意这两种方法设置分辨率都是scale,不是crop,所以如果不是等比例scale,会造成图像变形。2.生成dash mp4文件
ffmpeg -i input.flv -c copy -f mp4 -movflags dash output.mp4
关于movflags的选项,可以通过ffmpeg -h muxer=mp4查看
3.生成hls文件P96
生成实时的直播流:
ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -start_number 300 -hls_time 10 output.m3u8
-re :就是根据文件真实的帧率来读取文件,生成实时刷新的直播流,而不是一下子按照电脑的最大性能把文件一下子读进去。
-bsf:v h264_mp4toannexb :就是把mp4格式的nalu转换为annexb格式的P97有解释,对265来说为hevc_mp4toannexb
-start_number :生成ts文件的名称编号的开始数字
-hls_time : 文件切片长度。更多参数可以参考P96
-c 和-codec后面都跟codec name,就是指定codec
4.生成segment切片P105
segment切片比hls要灵活一些,因为hls只支持ts文件,segment可以切为mp4,ts,flv等各种文件格式,并且也可以生成像m3u8这种文件list。参数可以参考ffmpeg -h muxer=segment
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 test_output-%d.mp4
转码:
ffmpeg -i input.mp4 -c:v libx264 -g 50 -sc_threshold 0 -t 60 output.mp4
-g : gop 长度
-src_threshold : 这里等于0是为了场景切换时不自动插入I帧。如果只是设置-g,则碰到场景切换时,会自动插入I帧,所以不是严格的50帧为一个gop。P126
ffmpeg -i video_1920.mp4 -vf scale=640:360 video_640.mp4
-vf是调用video filter,这里用了scale filter来改变分辨率进行转码。
ffmpeg -i input.mp3 -acodec libmp3lame -b:a 64k output.mp3
使用libmp3lame库来转码mp3
ffmpeg -i input.wav -c:a aac -q:a 2 output.aac
-q:a参数可以分不同等级,对应不同码率P142
多媒体直播点播流的操作:
1.从rtsp服务器拉取直播流,存储为本地文件:
ffmpeg -rtsp_transport tcp -i rtsp://10.0.0.2/stream0 -c copy -f mp4 output.mp4
(这里实测只有video,拉不到audio,这里后面还要debug一下)
2.拉取http server的直播点播流
ffmpeg -i http://bbs.chinaffmpeg.com/live.m3u8 -c copy -f mp4 output.mp4
ffmpeg -i http://bbs.chinaffmpeg.com/live.ts -c copy -f mp4 output.mp4
一次转码,输出多路:
1.利用系统的管道:(注意“-”的使用)
ffmpeg -i input.mp4 -acodec aac -vcodec libx264 -f flv - | ffmpeg -f flv -i - -c copy -f flv out1.flv -c copy -f mp4 out2.mp4 -c copy -f flv rtmp://publish.chinaffmpeg.com/live/stream1
2.利用tee协议:
ffmpeg -re -i input.mp4 -vcodec libx264 -acodec aac -map 0 -f tee "[f=flv]rtmp://publish.chinaffmpeg .com/live/stream1 | [f=flv]rtmp://publish.chinaffmpeg.com/live/stream2”
dash流的生成
ffmpeg -re -i input.mp4 -c:v copy -acodec copy -f dash -window_size 4 index.mpd
P180
二:音视频文件的抽取:
1.ffmpeg -i intput.mp4 -vn -acodec copy output.aac
抽取aac音频流
-vn :disable video
-an: disable audio
2.ffmpeg -i input.mp4 -vcodec copy -an -bsf h264_mp4toannexb output.h264
抽取h264视频流
3.ffmpeg -i input.mp4 -vcodec copy -an -bsf hevc_mp4toannexb -f hevc output.hevc
抽取h265视频流,并且将nalu的格式转换为annexb格式。(P114)
-bsf后面接bit stream filter, 支持的filter可以看ffmpeg -bsfs来查看,这里就是利用了 hevc_mp4toannexb这个filter来实现格式的转换。
三:filter滤镜的使用
命令格式为:[输入流或标记名] 滤镜参数 [临时标记名];[输入流或标记名] 滤镜参数 [临时标记名] …
例子1:将一个图片logo作为overlay打在一段视频上,
a.使用filter_complex
ffmpeg -i input.mp4 -i logo.png -filter_complex "[1:v]scale=176:144[logo];[0:v][logo]overlay=x=0:y=0" output.mp4
b.使用-vf vf就是video filter
ffmpeg -i input.mp4 -vf "movie=log.png[wn]; [in][wn]overlay=30:10[out]" output.mp4
上面这两个命令就解释了filter_complex和vf (filter_simple)的区别,当有多个输入时,使用filter_complex,比如a中就是两个-i输入。b中只有一个输入-i,就使用-vf,这两个命令都实现相同的功能,但是filter的组合方式不一样。(暂时可以这么理解)
1.文字水印 利用drawtext filter (如果显示汉字,需要用的字体库支持汉字,本机支持的字库可以使用fc-list命令来查看)
ffmpeg -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=20:y=20" output.mp4
2.时间水印:enable的作用是每3秒显示一次,如果要一直显示,去掉enable选项。
ffmpeg -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='%{localtime\:%Y-%m-%d %H-%M-%S}’:fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)" output.mp4
(这里注意转义字符,:和,都需要转义,因为ffmpeg中,和:都是分隔符,是有特殊意义的,所以某些命令中需要的这些符号,都需要转义,告诉ffmpeg这不是ffmpeg的分隔符。比如这里的:就是localtime命令里面的,所以就需要转移,后面的逗号也是一样)
3.图片水印:movie 滤镜
ffmpeg -i input.mp4 -vf "movie=logo.png[wm];[in][wm]overlay=30:10[out]" output.mp4
半透明水印:
有些水印图片是有背景色的,比如很多logo图片是白底的,这时overlay到视频上会非常突兀,可以利用colorkey来做成半透明效果,colorkey有三个参数(ffmpeg -h filter=colorkey) :color,similarity, blend. color是指定要透明的颜色,similarity指定相似度,blend指定叠加的参数。下面的例子logo图片是白色底的,我们这里color就设置为white(也可以设置颜色色值,比如黑色就是全0x0000,也可以写black),similarity设置相似度,因为我们要把白色去掉,可以设置的小一些0.2,blend设置为0.5
ffmpeg -i input.mp4 -vf "movie=logo.png, colorkey=white:0.2:0.5 [wm]; [in][wm] overlay=30:10 [out]" output.mp4
4.画中画:
ffmpeg -re -i input.mp4 -vf "movie=sub.mp4,scale=480x320[test]; [in][test] overlay=x=main_w-480:y=main_h-320 [out]" -vcodec libx264 output.flv
5跑马灯,就是子视频从左向右游动
ffmpeg -re -i input.mp4 -vf "movie=sub.mp4,scale=480x320[test]; [in][test] overlay=x='if(gte(t,2), -w+(t-2)*20,NAN)':y=0 [out]" -vcodec libx264 output.mp4
6.九宫格 shortest参数是overlay的参数,表明终止最短的视频时全部终止
ffmpeg -re -i input1.mp4 -re -i input2.mp4 -re -i input3.mp4 -re -i input4.mp4 -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];[tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mp4
7.将字幕写入视频流 ass滤镜,这个滤镜是将字幕overlay到视频流上。
ffmpeg -i input.mp4 -vf ass=t1.ass -f mp4 output.mp4
8.将字幕流封装到文件中
ffmpeg -i input.mp4 -i t1.ass -acodec copy -vcodec copy -scodec copy output.mkv
如果input.mp4中已经有了字幕,想用t1.ass来替换原有的字幕,需要用map来指定(map n:m n指第几个输入,m指该输入的第几个流,从0开始计数。如-map 0:1 就是第0个输入的第1个流。)
ffmpeg -i input.mp4 -i t1.ass -map 0:0 -map 0:1 -map 1:0 -acodec copy -vcodec copy -scodec copy output.mkv
9.绿幕视频抠图(影视中的绿幕)
ffmpeg -i input.mp4 -i input_green.mp4 -filter_complex "[1:v]chromakey=Green:0.1:0.2[ckout];[0:v][ckout] overlay[out]" -map "[out]" output.mp4
10.获取视频截图
ffmpeg -i input.mp4 -ss 00:00:7.435 -vframes 1 out.png
定时获取截图
ffmpeg -i input.mp4 -vf fps=1 img%d.jpeg
一秒钟一张截图
ffmpeg -i input.mp4 -vf fps=1/60 img%03d.jpg
这样就是一分钟获取一帧截图
11音视频的倍速播放 atempo(音频)与setpts(视频)两个滤镜
atempo滤镜有一个参数tempo 范围为从0.5到2
ffmpeg -i input.wav -filter_complex "atempo=tempo=0.5" -acodec aac output.aac
setpts对视频倍速
ffmpeg -re -i input.mp4 -filter_complex "setpts=PTS*2" output.mp4
(半速)
12可以用ffserver + ffmpeg来搭建rtsp服务器
参考:https://blog.csdn.net/FPGATOM/article/details/98782202
ffserver是ffmpeg自带的一个程序,可以提供多种协议的server服务,通过配置文件ffserver.conf来配置不同的协议(这个文件默认路径为/etc/ffserver.conf,如果没有,在ffmpeg源码里面有,可以copy出来,ffserver -f ./ffserver来运行自己配置的配置文件)。但注意ffserver只提供协议层,不提供数据,所以需要ffmpeg来向ffserver feed数据。比如下面这个简单例子:
配置文件:
HTTPPort 8090
RTSPPort 5454
HTTPBindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 1000
CustomLog -
File /tmp/feed1.ffm
FileMaxSize 5M
ACL allow 127.0.0.1
# RTSP examples
# You can access this stream with the RTSP URL:
# rtsp://localhost:5454/test1-rtsp.mpg
#
# A non-standard RTSP redirector is also created. Its URL is:
Format rtp
Feed feed1.ffm
VideoCodec libx264
VideoFrameRate 25
VideoBitRate 100
VideoSize 1920x1080
#AVPresetVideo default
#AVPresetVideo baseline
AVOptionVideo flags +global_header
NoAudio #如果有audio, ffplay不能播放,还不知道为啥
#
#AudioCodec aac
#AudioBitRate 53
#AudioChannels 1
#AudioSampleRate 32000
#AVOptionAudio flags +global_header
# Server status
Format status
# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
#FaviconURL http://pond1.gladstonefamily.net:8080/favicon.ico
# Redirect index.html to the appropriate site
URL http://www.ffmpeg.org/
按照上面配置好之后,就可以运行ffserver了,ffserver -f ./ffserver.conf 就可以运行起来了
然后在另一个终端中用ffmpeg 给它feed video 流:
ffmpeg -re -i ./output.mp4 -vcodec copy http://localhost:8090/feed1.ffm
然后在另一个终端用ffplay就可以拉取rtsp流了,
ffplay -i rtsp://127.0.0.1:5454/live.h264 注意这里要使用127.0.0.1, 用localhost不行,可能是配置文件里面的配置有点问题,还没有细揪。
另外,还可以通过浏览器来查看ffserver的status, http://localhost:8090/stat.html可以看到现在存在的流
三:linux上录制屏幕
ffmpeg -f x11grab -framerate 25 -video_size 800x600 -i :0.0+300,200 output.mp4
就可以录制起始位置为(300,200), 大小为800x600的屏幕
二. 帮助信息的查看
ffmpeg -h muxer=mp4
查看mp4 muxer的参数支持
ffmpeg -h encoder=h264
ffprobe命令,用来查看多媒体信息
1.ffprobe -v quiet -show_packets -select_streams v test_output-0.mp4 2> x|grep pts_time | tail -n 3
查看文件视频流的pts, tail是查看尾部3个,要查看头部三个,用head -n 3