ffmpeg常用命令总结

一些global参数,各种功能都可以用
-ss 8 就是从第8秒开始读取文件进行后续操作
-t 10 就是截取10秒的数据
-vn :disable video
-an: disable audio
一.转码和转封装:

  1. ffmpeg -i ingput.rmvb -vcodec mpeg4 -b:v 200k -r 15 -s 640x480 -an -f mp4 -movflags faststart -y output.mp4
    -vcodec : 强制指定视频编码格式,-acodec 强制指定音频编码格式 (ffmpeg -codecs可以查看支持的codecs, 如果指定copy则就不转码,直接copy原来的stream到新文件)
    -b:v 指定视频的码率,b:a 指定音频码率 -b 指定视频和音频加起来的码率。
    -r : frame rate 帧率
    -an : disable audio 这样output.mp4里面没有音频。
    -f force format,指定文件格式(ffmpeg -formats可以列举支持的format)
    -movflags faststart : 如果不指定faststart, 则ffmpeg默认会将moov box放在mdat box的后面,如果加上这个flag,moov box会放在前面。
    -s :分辨率,还可以利用-vf scale=iw*0.9:ih*0.9来实现缩放,vf就是指定video filter,这里利用scale filter来实现。注意这两种方法设置分辨率都是scale,不是crop,所以如果不是等比例scale,会造成图像变形。
    -y : 覆盖输出文件,就是如果output.mp4文件已经存在,则不提示,直接覆盖,-n是不覆盖

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

生成fmp4:
ffmpeg -i xx.mp4 -vcodec copy -acodec copy -f mp4 -movflags frag_keyframe+empty_moov output.mp4

多媒体直播点播流的操作:
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 -
<Feed feed1.ffm>
 File /tmp/feed1.ffm
 FileMaxSize 5M
 ACL allow 127.0.0.1
 </Feed>

# 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:
<Stream live.h264>
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
</Stream>

# Server status
<Stream stat.html>
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
</Stream> 
# Redirect index.html to the appropriate site 
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>     

按照上面配置好之后,就可以运行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 -f alsa -i pulse -f x11grab -r 30 -s 1920x1080 -i :0.0 -acodec aac -ac 1 -ar 44100 -qscale 0.01 -vcodec libx264 -preset ultrafast -crf 0 output1.mp4

二. 帮助信息的查看
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

FFmpeg 4.2.8是一个开源的多媒体处理工具库,可以用于处理音频和视频文件。它提供了丰富的功能和命令行选项,可以对音频和视频进行各种操作。 引用提供了在FFmpeg中将视频加速到2倍速的命令行示例。使用此命令,您可以将一个视频文件的播放速度加快到原来的两倍。 引用提供了将视频减速到一半速度的命令行示例。使用此命令,您可以将一个视频文件的播放速度减慢到原来的一半。 引用提供了一个示例,展示了如何将音频和视频文件合并为一个输出文件。使用此命令,您可以将一个视频文件和一个音频文件合并为一个包含视频和音频的文件。 总结而言,FFmpeg 4.2.8是一个功能强大的多媒体处理工具库,可以用于处理音频和视频文件。您可以使用不同的命令行选项来实现各种操作,例如加速、减速和合并音视频文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ffmpeg常用指令及介绍(转码 水印 字幕 截图等)](https://blog.csdn.net/megary/article/details/90667975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值