更详细请参考ffmpeg手册,下载ffmpegrelease版后在doc中就有,主页面。video filter 参考ffmpeg-filters.html
ffmpeg -i E:/1/22-.mp4 -ss 11:0 -t 1:0 -b:v 1M -vf setpts=N/FRAME_RATE/TB -af asetpts=N/SR/TB -vcodec hevc_nvenc E:/1/2-.mp4
"-vf setpts=N/FRAME_RATE/TB -af asetpts=N/SR/TB":重置视频和音频的时间线。vf是video filter的缩写
"-vcodec hevc_nvenc":对视频进行重编码时,设置视频编码器为hevc_nvenc(主要是利用显卡编码速度快)
"-codec copy ":表示对原始编码的视频和音频直接拷贝,相当于"-vcodec copy "和"-acodec copy"。对视频进行时如果视频帧率或音频采样率不同会出现https://blog.csdn.net/qiushangren/article/details/132418796 中所提到的问题
"-i E:/1/22-.mp4":设置输入视频
"-ss 1:1:1":截取视频时设置开始时间1:1:1 。如果-ss 参数在-i参数之前,会定位到该时间点之后最近的i帧或p帧,有时会出现开头视频解码错误(可能定位到了一个p帧),这时可以通过截取1分钟视频,将时间往前调几秒钟进行尝试。在视频文件中两i帧之间的间隔从几毫秒到几十秒不等。
对截取视频进行重新编码的方案,会先找目标时间点附近往前的最近的i帧,然后精确定位到时间点的帧进行重编码。
"-t 1:1:1":截取视频时设置时长1:1:1 ,放在-i之前,表示对输入视频进行时长限制,读取到对应时长就不读了,放在-i之后表示对输出进行时长限制,写完对应时长就不写了。
"-to 2:2:2":截取视频时设置截止时间2:2:2 ,放在-i之前,表示对输入视频进行截止时间限制,读取到对应截止时间就不读了,放在-i之后表示对输出进行截止时间限制,写完对应截止时间就不写了。这个与-ss一起使用时,需要注意与-ss 放置的位置要一致 。
"-b:v 1M":设置视频流码率1M"
ffmpeg -ss 22:30 -accurate_seek -i E:/1/1.mp4 -t 2:0 -avoid_negative_ts 1 -c copy E:/1/11-.mp4
"-avoid_negative_ts 1" :结合-c copy 使用。直接跳转到目标时间点最近的I帧开始,避免出现视频解码错误的现象。avoid_negative_ts的值为[-1,2],为正数时才会进行跳转,默认值为0.
"-accurate_seek" :结合-ss使用,允许ss是否精确定位。(暂时没发现有什么特殊之处)
"-start_at_zero" :结合-ss使用,当-ss 放在 -i前面时才用到该参数。
ffmpeg -f concat -i E:/1/videos.txt -safe 0 -codec copy E:/1/a.mp4 //拼接多个视频文件。(视频拼接需要视频的码率、帧率、宽、高等等参数一致,对于有差异的视频需要通过filter对其进行处理后格式变成一致才能进行拼接。判断视频参数是否一致,需要通过ffprobe进行探查)
"-f concate" 表示拼接视频
"-i E:/1/videos.txt" :指定存放要拼接的文件的内容。可以对满足拼接条件的多个文件进行拼接。
-safe 0:允许使用不安全的文件名,这对于指定文件路径非常有用。如果不加这个参数,当文件名包含特殊字符时,可能会导致拼接失败。
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex concat=n=2:v=1:a=1 output.mp4
拼接input1.mp4和input2.mp4两个视频文件,output.mp4是拼接后的输出文件。其中,n表示需要拼接的文件个数,v表示是否拼接视频流,v=1表示拼接视频流,v=0表示不拼接视频流,a表示是否拼接音频流。
ffmpeg -i 1.mp3 -i 2.mp3 -filter_complex amerge -ac 2 -c:a libmp3lame -q:a 4 output.mp3:
-ac:设定声音的channel数
-c:a libmp3lame:指定音频编码器为libmp3lame
-q:a:表示输出的音频质量,一般是1到5之间(1 为质量最高)
ffmpeg -i 1.mp3 -i 2.mp3 -i 3.mp3 -filter_complex "[1:a]adelay=1000[a1];[2:a]adelay=1000[a2];[0:a][a1][a2]concat=n=3:v=0:a=1" output.mp3: 拼接三段音频,在每段之间加入一秒的空白。
-filter_complex "[1:a]adelay=1000[a1]":第2段素材的音频(如果是视频就是[1:v]),延迟1000毫秒播放,并且赋值为a1,供后面使用。同理定义了a2。
-filter_complex "[0:a][a1][a2]concat=n=3":将第一段素材的音频、a1和a2拼接,n=3表示三段。
v=0:a=1:不要声音,只要音频。
ffmpeg -i 1.mp4 -i bg.jpg -i font.png -filter_complex "[0:v]scale=1080:-1[video];[1:v][video]overlay=x=0:y=(1920-h)/2[v1];[v1][2:v]overlay" -codec:a copy output1.mp4:bg.jpg是1080*1920的竖版图片用作背景,font.png是1080*1920的带透明通道的字幕图片。目的是在背景图中间嵌入(合并)视频1.mp4,并对1.mp4保持宽为1080的自适应缩放,最后合并上字幕。
0:v\]scale=1080:-1\[video\]:第一个素材的只取视频,按比例resize成宽1080,输出赋值为video。 \[1:v\]\[video\]overlay=x=0:y=(1920-h)/2\[v1\]:将第video放在背景图上层,位置是x,y,输出赋值为v1. \[v1\]\[2:v\]overlay:将第三个素材的视频放在v1上层。 音频、视频合并 ffmpeg -i 1.mp4 -i 1.mp3 -filter_complex "\[1:a\]volume=0.3\[a1\];\[0:a\]\[a1\]amix=inputs=2:duration=first\[a\]" -map 0:v -map "\[a\]" -c:v copy -c:a aac -y output.mp4:视频合成, 原视频有声音,在保持原视频声音不变的情况下,添加背景音,并让背景音音量变小。 \[1:a\]volume=0.3\[a1\]:第二个素材的音频音量取30%,输出赋值为a1; \[0:a\]\[a1\]amix=inputs=2:duration=first\[a\]:第一个素材(视频)的声音和背景音混合,时长为第一个素材的声音,输出赋值a; -map 0:v:视频流式拼接,这里只有一个视频; -map "\[a\]":音频流式拼接,这里取刚刚输出的a; -c:v copy:视频编码不变; -c:a aac :音频编码acc。 -y:输出文件覆盖 ffmpeg -i 1.mp4 -i 1.mp3 -filter_complex "\[0:v\]trim=0:10.1\[v\];\[1:a\]adelay=1000\[a\];\[v\]\[a\]concat=n=1:v=1:a=1" -c:v libx264 -c:a aac -movflags +faststart output.mp4:视频合成, 去掉原视频的声音,重新配音,并且声音前增加1秒的空白。 \[0:v\]trim=0:10.1\[v\]:视频取1-10.1秒,这里单位是秒,输出赋值v; \[1:a\]adelay=1000\[a\]:音频演示1000毫秒播放,这里单位是毫秒; \[v\]\[a\]concat=n=1:v=1:a=1:音视频合在一起,输出需要视频和音频; -c:v libx264:视频编码使用x264; -c:a aac:音频编码acc; -movflags +faststart :这个参数跟mp4的元数据有关,设为faststart表示会将moov移动到mdat的前面,在线播放的时候会稍微快一些。 ffmpeg -i E:/1/2.mp4 -r 15 E:/1/22-.mp4 "-r 15" :修改视频帧率时使用,设置目标视频帧率。 ffmpeg -i E:/1/6-.mov -r 29.97 -ar 44100 -map 0:0 -map 0:1 E:/1/6.mov //*作用是将文件变换帧率,同时保持原来文件流的序列号。此案例中6-.mov原来stream 0是音频流,stream 1是视频流,但是使用ffmpeg进行重新编码后(此处使用-r就会导致重新编码),ffmpeg会默认将视频流设置为stream 0,音频流设置为stream 1。要保持原来的流序列号。就需要通过-map\[stream\] (stream 可用 "文件序号:流序号" 或者 流别名 表示)来设置先后顺序,第一个map设置第一个输入文件的第一个流为 stream 0 ;第二个map设置第一个输入文件的第二个流为stream 1* -map input_file_index:stream_number:挑选流和设置流序列号。 -ar 44100 : 设置音频的采样率为44100 ffmpeg -i E:/1/6-.mov -video_track_timescale 30K -r 29.97 -c:v libx264 -b:v 7M E:/1/6.mov -video_track_timescale 30K 设置tbn为30K,在新版的ffmpeg中tbc已经被抛弃了。设置tbn必须通过这个参数进行。**拼接的两个视频的tbn不一致的时候,会导致合成的目标视频出现时长紊乱。** 参考: https://superuser.com/questions/1362410/what-is-fps-tbr-tbn-tbc-in-ffmpeg https://video.stackexchange.com/questions/33134/ffmpeg-resizing-mp4-changes-the-timebase-tbn-tbc ffmpeg -i E:/1/1.mp4 -r 25 -vf scale=848:1520 -b:v 1M -c:v hevc_nvenc E:/1/1-.mp4 -vf scale=848:1520 表示将1.MP4的视频的长宽通过伸缩的方式改为848:1520。scale=w:h。当w为-1时表示保持原来的长宽比,并将h设置为新的值;h亦然。(**视频合拼后出现乱码,很有可能是因为视频的尺寸对不上** ) ffmpeg -i E:/1/1.mp4 -vf crop='720:1280:200:200' E:/1/1-.mp4 -vf crop='720:1280:200:200' 表示将1.MP4的视频的长宽通过裁剪的方式改为720:1280。crop='w:h:x:y'。x和y可以不进行设置,程序会自动计算,默认居中。w和h是主要值,x和y超出范围的值会被削减为范围值。 0:逆时针旋转90度并垂直翻转,1:顺时针旋转90度,2:逆时针旋转90度,3:顺时针旋转90度后并垂直翻转 ffmpeg -i E:/1/1.mp4 -ss 2:55:10 -t 30:0 -r 24 -ac 1 -ar 44100 -video_track_timescale 20K -vf "scale=720:1280,setsar=sar=1:1" -b:v 1M -c:v hevc_nvenc E:/1/1-.mp4 1. **PAR图像纵横比:PAR=(每行像素数)/(每列像素数)=分辨率,通过scale或-s可进行设置** 2. **SAR样点纵横比:SAR=(像素的宽)/(像素的高)。像素不一定都是正方形的。** 3. **DAR显示纵横比:一般说的16:9和4:3指的是DAR。DAR=(每行像素数像素的宽)/(每列像素数像素的高),即DAR=PAR\*SAR** -vf "scale=720:1080,setsar=sar=1:1" :设置视频幅度为720:1080 ,设置sar=1:1 -ac 1 :设置声音为单通道,如果stereo应该设置为2通道 -ab 56K :设置声音的比特率 等价于"-b:a 56K" -ar 44100 : 设置音频的采样率为44100 ffmpeg -i D:/1/1.mp4 -vf "split \[main\]\[tmp\]; \[tmp\] crop=iw:ih/2:0:0, vflip \[flip\]; \[main\]\[flip\] overlay=0:H/2" D:/1/b.mp4 将视频上半部分水平镜像到下半部分形成新的视频。   [main] input --> split ---------------------> overlay --> output | ^ |[tmp] [flip]| +-----> crop --> vflip -------+ input就是原输入流,上图整个流程就做了这些操作, 首先使用split滤波器将input流分成两路流(main和tmp),然后分别对两路流进行处理。对于tmp流,先经过crop滤波器进行裁剪处理,再经过flip滤波器进行垂直方向上的翻转操作,输出的结果命名为flip流。再将main流和flip流输入到overlay滤波器进行合成操作。上图的input就是上面提过的buffer源滤波器,output就是上面的提过的buffersink滤波器。 以上操作使用命令实现是 ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT 同一个线性链中的过滤器用逗号分隔,不同的过滤器线性链用分号分隔。 在我们的例子中,裁剪,vflip在一个线性链中,分割和叠加在另一个链中是分开的。线形链连接的点用方括号括起来的名称进行标记。 在本例中,拆分过滤器生成与标签[main]和[tmp]相关联的两个输出。 一些过滤器接受输入的参数列表:它们在过滤器名称和等号之后指定,并用冒号分隔。 描述:前景窗口(第二输入)覆盖在背景窗口(第一输入)的指定位置。 语法:[main_name][overlay_name]overlay[=x:y[[:rgb={0, 1}]] 参数 x 和 y 是可选的,默认为 0。 参数 rgb 参数也是可选的,其值为 0 或 1,默认为 0。 参数说明: x 从左上角的水平坐标,默认值为 0 y 从左上角的垂直坐标,默认值为 0 rgb 值为 0 表示输入颜色空间不改变,默认为 0;值为 1 表示将输入的颜色空间设置为 RGB 变量说明:如下变量可用在 x 和 y 的表达式中 main_w 或 W 主输入(背景窗口)宽度 main_h 或 H 主输入(背景窗口)高度 overlay_w 或 w overlay 输入(前景窗口)宽度 overlay_h 或 h overlay 输入(前景窗口)高度 ffmpeg -i 1.mp4 -vf pad=2\*iw 4.mp4 :将宽度扩展一倍,用黑色填充。 -vf pad=2\*iw:将宽度扩展为原来的两倍,pad=w:h:x:y:violet (violet 紫色)  ffmpeg -i 1.mp4 -vf split\[a\]\[b\];\[a\]pad=2\*iw\[1\];\[b\]hflip\[2\];\[1\]\[2\]overlay=w:0 7.mp4 F1: split过滤器创建两个输入文件的拷贝并标记为\[a\],\[b
F2: [a]作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到[1].
F3: [b]作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到[2].
F4: 用overlay过滤器把 [2]覆盖到[1]的旁边.
ffmpeg -i .test.mp4 -i test1.mp4 -lavfi hstack output.mp4 :将两个相同格式的视频左右拼接(对于不同格式视频的拼接需要先用vf将视频进行修正)
-lavfi hstack :左右拼接, vstack 上下拼接
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -lavfi hstack=inputs=3 output.mp4 :3个视频左右拼接
ffmpeg -i test.mp4 -vf "transpose=1" out.mp4 :顺时针旋转90° transpose=2 逆时针90°
ffmpeg -i test.mp4 -vf hflip out.mp4 :水平翻转视频画面 vflip垂直翻转
ffmpeg -i ring.mp4 -i ring_100x87.png -filter_complex overlay=W-w:H-h-56 -max_muxing_queue_size 1024 ring_logo_b.mp4 :对ring.mp4添加水印。
ffmpeg -i ring.mp4 -itsoffset 8.6 -i ring_100x87.png -filter_complex overlay=W-w:56 -max_muxing_queue_size 1024 ring_logo_delay.mp4:背景窗口播放 8.6 秒后,图标开始显示。注意 "-itsoffset 8.6" 作为第二个输入文件的输入选项,参数位置不能放错。
ffmpeg -i D:/1/a.mp4 -filter_complex "[0:v]split=3[v0][v1][v2];[v0]trim=0:10,setpts=PTS-STARTPTS[vout0];[v1]trim=10:20,setpts=PTS-STARTPTS[vout1];[v2]trim=20:30,setpts=PTS-STARTPTS[vout2];[0:a]asplit=3[a0][a1][a2];[a0]atrim=0:10,asetpts=PTS-STARTPTS[aout0];[a1]atrim=10:20,asetpts=PTS-STARTPTS[aout1];[a2]atrim=20:30,asetpts=PTS-STARTPTS[aout2]" -c:v hevc_nvenc -map [vout0] -map [aout0] D:/1/output0.mp4 -map [vout1] -map [aout1] D:/1/output1.mp4 -map [vout2] -map [aout2] D:/1/output2.mp4 -y 将一个30s的视频按时间先后拆分成三个10s的视频。ffmpeg 中的video filter 和audio filter是分开的,所以对声音和视频需要分开处理。按时间先后顺序拆分视频,最便捷的截取方式应该是 通过-ss和 -t参数进行操作。
ffmpeg -f lavfi -i "aevalsrc=10:d=2" -f lavfi -i "anullsrc=duration=1" -filter_complex "[0:a][1:a]amix=inputs=2:duration=first:dropout_transition=0" output.wav:在音频之间多次插入随机静音的效果
aevalsrc=0:d=2:aevalsrc为音频滤镜,这段作用表示生成2秒钟的静音音频
anullsrc=duration=1:anullsrc为音频滤镜,这段作用为生成1秒钟的空白音频
0:a\]\[1:a\]amix=inputs=2:duration=first:dropout_transition=0:amix为音频滤镜,这段作用表示将静音音频和空白音频混合在一起, amix作用是混合音频,音量大小等于1/n,amix混合不同时长的音频时,会出现音频音量前后不一致, [ffmpeg使用amix混合多个音频时音量变小或音量不一致问题-CSDN博客](https://blog.csdn.net/winter2121/article/details/136438048 "ffmpeg使用amix混合多个音频时音量变小或音量不一致问题-CSDN博客") [FFmpeg音频滤镜(12) - 简书](https://www.jianshu.com/p/c84ff5158085 "FFmpeg音频滤镜(12) - 简书") 将图片制作成一个小视频,然后添加到长视频开头: (1)ffmpeg -f lavfi -t 0.1 -i anullsrc=r=44100:cl=mono -c:a aac -ab 69K D:/1/test.aac -y :制作0.1秒的静音音频流文件,采样率ar、编码器c:a、通道数cl、码率b:a 要与目标文件一致。 (2)ffmpeg -t 0.1 -f image2 -loop 1 -i D:/1/1.jpeg -r 22.37 -video_track_timescale 17152 -vf "setsar=sar=1:1" -b:v 1M -c:v hevc_nvenc D:/1/11-.mp4 制作0.1秒长的视频流文件,分辨率(不一样的时候可以使用vf 中的scale\|crop\|pad等进行操作,保证输出的视频流文件与目标的一致)、帧率-r、tbn、sar 与目标文件的视频流保持一致。 (3)ffmpeg -i D:/1/11-.mp4 -i D:/1/test.aac -map 0:0 -map 1:0 D:/1/1-.mp4:将音频流和视频流合并,-map 的位置极为重要,他设置了视频流和音频流的下标,这里-map 0:0 表示第一个输入文件的第一个流作为输出文件的第一个流,-map 1:0 表示第二个输入文件的第一个流,必须保证与目标流下标对应。就此制作完成 (4)ffmpeg -f concat -i D:/1/videos.txt -c copy D:/1/a.mp4 ,拼接两个文件。 **vf中的concat**:1.mkv 2.mkv 3.mkv每个视频都有3个流,分别是v\[0\] a\[1\] a\[2\]。使用vf将三个视频拼接成一个视频 ffmpeg -i 1.mkv -i 2.mkv -i 3.mkv -filter_complex \ '[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2] concat=n=3:v=1:a=2 [v] [a1] [a2]' \ -map '[v]' -map '[a1]' -map '[a2]' output.mkv concat=n=3:v=1:a=2 ,表示目标文件和输入文件的流有3个,v有一个,a有两个。 对part1.mp4和part2.mp4的视频进行缩放后拼接成一个文件,操作如下: movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ; movie=part2.mp4, scale=512:288 [v2] ; amovie=part2.mp4 [a2] ; [v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa] **其他参数** ffmpeg -i E:/1/1.mp4 -metadata title=xxx -metadata copyright=xxx.com -metadata comment=xxx.com -t 1:0 -b:v 1M -c:v hevc_nvenc E:/1/2-.mp4 设置title copyright comment等参数。 GOP ffprobe -i D:/1/a.mp4 -select_streams v:0 -show_frames \>D:/1/h1.txt :查看gop(计算两个I帧pict_type=I的时间间隔,具体视频流中,每个gop的时间长度有所差异,gop在编码是只是一个参考值) ffmpeg -i D:/1/a.mp4 -f segment -segment_time 2 -reset_timestamps true -avoid_negative_ts 1 -c copy D:/1/out%d.mp4 -y :将D:/1/a.mp4的内容按不小于2秒以gop为单位进行裁剪。不会截断gop。 **segment详细参数参考ffmpeg手册中的"(stream) segment muxer AVOptions"段。** ffmpeg -t 3 -i D:/1/a.mp4 -avoid_negative_ts 1 -c copy D:/1/outtest.mp4 :截取3秒,会截断gop。 ***如何用ffmpeg准确剪切视频,对初始gop进行重编码(最方便的还是对视频重编码):***[Can you losslessly ediit H264 at the GOP level? -Stack Exchange](https://video.stackexchange.com/questions/23533/can-you-losslessly-ediit-h264-at-the-gop-level "Can you losslessly ediit H264 at the GOP level? -Stack Exchange")*** 回答1***   回答2:   设备: ffmpeg -devices 查询当前的设备有哪些,windows下建议使用dshow,mac下建议使用foundation  ffmpeg -f dshow -list_devices true -i "" 该命令可以查询设备列表(空引号表示列举,也可以用单词 dummy 来代替) (-i 指定设备 mac 下 1表示桌面(命令查询mac下的索引号)) ffmpeg -f dshow -list_options true -i video="USB Live Camera" :该命令查看设备"USB Live Camera"支持的格式 。可以看到该设备有pin 0 和pin 1,两者支持的格式不一样,pin 1中支持h264。 ffplay -f dshow -vcodec h264 -video_pin_name 1 -framerate 30 -video_size 1920\*1080 -x 640 -y 480 -i video="USB Live Camera" -f dshow -i audio="麦克风 (USB Live Camera audio Devi)" :捕捉设备"USB Live Camera" pin 1中的h264编码分辨率为1920\*1080,帧率为30帧的格式的画面。并显示成640\*480画幅的画面,并采集"麦克风 (USB Live Camera audio Devi)"的声音。 ffplay -f dshow -vcodec mjpeg -framerate 30 -video_size 1920\*1080 -x 640 -y 480 -i video="USB Live Camera":捕捉设备"USB Live Camera" pin 0(默认pin值)中的h264编码分辨率为1920\*1080、帧率为30帧的格式的画面。并缩放显示成640\*480画幅的画面。 -x -y:设置ffplay播放窗口的长和高。 ffplay -f gdigrab -offset_x 10 -offset_y 20 -video_size 640:480 -i desktop :通过gdigrab捕捉桌面区域。 -offset_x -offset_y 用于设置捕获的画面的偏移,-video_size是设置捕获换面的长宽。这两个参数用于控制捕获行为。 ffplay -f gdigrab -i desktop -x 640 -y 480 :通过gdigrab捕捉桌面,并缩放成640\*480来显示 -x -y 是设置输出的画幅的 ffplay -f gdigrab -i desktop -vf "scale=640:480" :通过gdigrab捕捉桌面,并缩放成640\*480来显示 ffmpeg -f gdigrab -framerate 6 -i title=tools out1.mp4 :使用gdigrab采集窗口名字为tools 的窗口的画面。 ffplay -f vfwcap -i 0 :捕捉设备编号为0 的画面采集设备的画面。 ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt 420p out.yuv :将imput.mp4 转换成YUV420p格式的文件out.yuv,-c:v rawvideo表示输出视频无编码, ffplay -pix_fmt yuv420p -s 608x368 out.yuv :播放yuv格式文件。-s指定画面的长宽,是必须得参数 ffplay -pix_fmt yuv420p -s 608x368 -vf extractplanes = 'y' out.yuv :提取出y分量播放 ffmpeg -i input.mp4 -filter_complex 'extractplanes= y+u+v\[y\]\[u\]\[v\] ' -map '\[y\]' y.yuv -map '\[u\]' u.yuv -map '\[v\]' v.yuv :从mp4文件中提取出y u v 分量的文件。 ffplay -pix_fmt gray -s 608x368 y.yuv :播放y分量的文件 ffplay -pix_fmt gray -s 304x184 u.yuv :播放u分量的文件  -vsync 1:表示输入视频同步 -async 1:表示输入音频同步 -b:v 200k -maxrate 250k -bufsize 400k:表示输出视频码率200k,最大码率250k,缓存大小400k -coder 1:表示使用cabac进行熵编码 -refs 3 -bf 5:表示编码时用到的参考帧数量为3帧,b帧数量最大为5帧 -flags +loop -deblock -1:-1 :表示使用去块化的滤波器,后面是它的参数 -partitions i4x4+i8x8+p8x8+b8x8:-partitions设置宏块分析,可以包含i4x4、i8x8、p8x8、b8x8, -me_method umh:设置运动估算算法,umh表示不均衡的六边形算法 -g 60 keyint_min 30:设置gop为60 ,最小gop为30 -qmin 0 -qmax 69 -qdiff 2:设置量化器参数,-qdiff设置q p step 设置设置的是2 ffplay -f dshow -i video="USB Live Camera" -vf "drawtext=text='%{pts\\:hms}':x=10:y=10:fontsize=40:fontcolor=red" 捕获摄像头视频并打上时间 ffmpeg -re -i 'input.mp4' -c:v libx264 -preset slow -tune film -b:v 2000k -maxrate 2500k -bufsize 4000k -g 60 -c:a aac -b:a 128k -f flv 'rtmp://server-address/stream-name' 将视频进行推流, -re:表示以实时模式推流。使用该参数时,FFmpeg会尽可能快地读取源文件并将数据推送到服务器,以保证推流的实时性。 -preset :是h264的一个预设选项,可用于设置编码速度和质量的平衡,控制FFmpeg的编码器。 -tune :是h264的一个预选项,主要配合视频类型和视觉优化的参数,或特别的情况。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的) [【x264】x264编码器参数配置-CSDN博客](https://blog.csdn.net/weixin_42877471/article/details/138524724 "【x264】x264编码器参数配置-CSDN博客") [x264编码参数详解与最佳实践-CSDN博客](https://blog.csdn.net/wangbuji/article/details/121876277 "x264编码参数详解与最佳实践-CSDN博客") 通过preset参数,我们可以非常方便地设置输出视频的速度、质量等内容,达到我们需要的效果。 -preset参数的取值范围依据编码器而不同。这里我们以视频编码器x264为例,介绍几个比较常用的-preset参数: -preset ultrafast :编码速度非常快,但输出视频质量不高 -preset superfast :编码速度非常快,但输出视频质量比ultrafast略微高一些 -preset veryfast :编码速度比较快,输出视频质量较好 -preset faster :编码速度比较快,输出视频质量比veryfast略微差一些 -preset fast :编码速度适中,输出视频质量较好 -preset medium :编码速度适中,输出视频质量非常好,是默认值 -preset slow :编码速度较慢,但输出视频质量比medium更好 -preset slower :编码速度比slow略微慢一些,但输出视频质量更好 -preset veryslow :编码速度最慢,但输出视频质量最好 -preset参数的其他用途 -preset参数不仅可以用于控制编码速度和质量,还可以用于优化视频和音频的编码。例如,我们可以使用-preset tune选项来进行编码优化,以适应不同的情况。可以通过x264的--tune参数或ffmpeg的-x264-params参数来指定。 下面是一份x264的-tune选项列表: film :该选项用于处理电影或其他传统镜头的视频,适用于视频的动态图像较少。缺省设置为无。 animation :该选项用于处理动画或卡通片,适用于视频的动态图像较多。缺省设置为no。 grain :该选项用于处理具有高噪声的视频。缺省设置为no。 stillimage :该选项适用于处理静止图像。缺省设置为no。 psnr :该选项用于计算视频的PSNR值。缺省设置为no。 ssim :该选项用于计算视频的SSIM值。缺省设置为no。 fastdecode: 可以快速解码的参数; zerolatency:零延迟,牺牲视频质量减少延迟,比如视频会议 原文链接:https://blog.csdn.net/lixiaowu119/article/details/136705644 -bufsize:设置缓存大小,让推流过程更平滑。 -f flv :将mp4格式转换成flv格式,因为flv存放格式与rtmp的包格式是极为相近的,只是使用的包头不同 x264编码参数详细解释: [X264 Settings - MeWiki :http://www.chaneru.com/Roku/HLS/X264_Settings.htm](http://www.chaneru.com/Roku/HLS/X264_Settings.htm "X264 Settings - MeWiki :http://www.chaneru.com/Roku/HLS/X264_Settings.htm") [介绍类似CABAC变成coder的详细映射关系:https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping](https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping "介绍类似CABAC变成coder的详细映射关系:https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping") [https://www.cnblogs.com/hgdhome/p/9372800.html](https://www.cnblogs.com/hgdhome/p/9372800.html "https://www.cnblogs.com/hgdhome/p/9372800.html") [FFmpeg 常用命令_ffmpeg改变视频帧率_wk灬丨的博客-CSDN博客](https://blog.csdn.net/weixin_47592544/article/details/130970063 "FFmpeg 常用命令_ffmpeg改变视频帧率_wk灬丨的博客-CSDN博客") [FFmpeg个人使用指南_ffmpeg force_style_jerrylin07的博客-CSDN博客](https://blog.csdn.net/jerrylin07/article/details/113093287 "FFmpeg个人使用指南_ffmpeg force_style_jerrylin07的博客-CSDN博客") [FFMPEG命令入门到提高,一篇文章就够了 - 知乎](https://zhuanlan.zhihu.com/p/117523405 "FFMPEG命令入门到提高,一篇文章就够了 - 知乎") [FFmpeg Filter过滤器_ffmpeg configure_filtergraph_生椰_李点点的博客-CSDN博客](https://blog.csdn.net/weixin_41643938/article/details/124620127 "FFmpeg Filter过滤器_ffmpeg configure_filtergraph_生椰_李点点的博客-CSDN博客") [使用ffmpeg将图片拼接为视频--技术员007 ଘ(੭ˊᵕˋ)੭](http://007.gangguana.com/a/30a5912eddf39a6aeb03d84852d87492.shtml "使用ffmpeg将图片拼接为视频--技术员007 ଘ(੭ˊᵕˋ)੭") [ffmpeg 基本命令介绍 - 简书](https://www.jianshu.com/p/062f5842ed89 "ffmpeg 基本命令介绍 - 简书") [FFmpeg+SDL播放器开发实践:解析、解码、渲染全流程详解 - 知乎](https://zhuanlan.zhihu.com/p/647600075 "FFmpeg+SDL播放器开发实践:解析、解码、渲染全流程详解 - 知乎") [FFmpeg ------ 屏幕录像和录音并推流(命令行的方式) - 知乎](https://zhuanlan.zhihu.com/p/636152437 "FFmpeg —— 屏幕录像和录音并推流(命令行的方式) - 知乎")