当前位置: 首页 > article >正文

ffmpeg filter 滤镜命令

更多ffmpeg命令文章

ffmpeg常用命令-CSDN博客

介绍

FFmpeg filter滤镜是一种强大的功能,可以用于处理和操作视频和音频数据。滤镜的主要作用如下:

  • 视频处理:

    • 调整视频分辨率、宽高比、帧率等属性
    • 执行视频剪辑和裁剪操作
    • 应用各种视觉特效,如模糊、锐化、色彩校正等
    • 合成多个视频源,如画中画、叠加文字等
  • 音频处理:

    • 调整音量、均衡、混合多个音频轨道
    • 添加回声、噪音抑制等音频特效
    • 执行音频剪辑和拼接
  • 格式转换:

    • 在不同的编解码器和容器格式之间进行转换,实现视频和音频的解复用操作。
  • 分析和调试:

    • 测量视频和音频的质量指标,如 PSNR、SSIM 等
    • 获取视频和音频的元数据信息

FFmpeg 提供了大量内置的滤镜,涵盖了上述各种功能。这些滤镜可以灵活组合使用,构建出复杂的视频和音频处理流程。

filter 的分类

按照处理数据的类型,通常多媒体的filter分为:

  1. 音频filter
  2. 视频filter
  3. 字幕filter

⽀持的filter的列表可以通过以下命令获得

 ffmpeg -filters

以下常⽤的⼀些filter。

scale:视频/图像的缩放

overlay:视频/图像的叠加

crop:视频/图像的裁剪

trim:截取视频的⽚段

rotate:以任意⻆度旋转视频

另一种按照处于编解码器的位置划分:

  • Prefilters(预处理滤镜):

    • 这类滤镜会在编码过程开始之前应用到视频数据上。
    • 它们可以用于对原始视频进行各种预处理操作,如缩放、裁剪、添加水印等。
    • 这些操作可以提高编码效率,降低码率和提高视觉质量。
    • 常见的预处理滤镜有 scale、crop、overlay 等。
  • Intrafilters(编码内部滤镜):

    • 这类滤镜是编解码器内部使用的滤镜,是编解码过程中不可或缺的一部分。
    • 它们在编码阶段应用,通常用于降噪、去块、锐化等操作,以改善编码质量。
    • 这些滤镜对于特定的编码器而言是固有的,不同编码器可能会有不同的内部滤镜。
    • 常见的内部滤镜有 deblock、sharpen 等。
  • Postfilters(后处理滤镜):

    • 这类滤镜会在解码过程之后应用到视频数据上。
    • 它们可用于改善解码后的视频质量,如去噪、锐化、色彩调整等。
    • 后处理滤镜通常是可选的,用户可根据需要自行应用。
    • 常见的后处理滤镜有 denoise、unsharp 等。

FFmpeg 中filter 分为:

  • Source Filters(源滤镜):
    • 这类滤镜没有任何输入,只有输出
    • 它们通常用于产生原始的视频或音频数据,如生成测试模板、视频捕获等。
    • 例如 colorlifemandelbrot 等。
    • ffplay -f lavfi -i testsrc
      
      -f lavfi 表示使用 Libavfilter 过滤器框架。
      -i testsrc 指定使用 testsrc 滤镜作为输入源。
      最后 ffplay 命令会启动一个视频播放器,并播放由 testsrc 滤镜生成的测试视频。
  • Audio Filters(音频滤镜):
    • 这类滤镜处理的是音频数据。
    • 它们至少有一个输入和一个输出。
    • 常见的音频滤镜有 音量调整滤镜 volume、均衡器滤镜 equalizer、回声滤镑 aecho、混音滤镜 amix、变速滤镜 atempo等。
    •  #将音量放大2倍
      -filter:a "volume=2.0" 
      #将100Hz频段增益20dB
      -filter:a "equalizer=f=100:width_type=h:width=50:g=20"
      #添加一个衰减系数为0.8、延迟时间1000ms、混合系数0.3的回声
      -filter:a "aecho=0.8:0.88:1000:0.3"
      #将两个输入音频流混合为一个
      -filter:a "amix=inputs=2:duration=first"
      #将音频快放1.5倍
      -filter:a "atempo=1.5" 
  • Video Filters(视频滤镜):
    • 这类滤镜处理的是视频数据。
    • 它们至少有一个输入和一个输出。
    • 例如前面提到的 缩放滤镜 scale、裁剪滤镜 crop、旋转滤镜 rotate 水印滤镜 overlay 模糊滤镜 blur 色彩滤镜 colorbalance 等滤镜。
    • #视频缩放到 640x360 分辨率
      -vf "scale=640:360"  
      #视频裁剪出一个 100x100 的区域
      -vf "crop=100:100:50:50"
      #视频顺时针旋转 45 度
      -vf "rotate=PI/4" 
      #视频上添加图像水印
      -vf "overlay=main_w-overlay_w-10:main_h-overlay_h-10"
      #视频增加模糊效果
      -vf "blur=luma_radius=10:luma_power=2" 
      #调整色彩平衡
      -vf "colorbalance=rs=1.1:gs=0.9:bs=0.8" 
      
  • Multimedia Filters(多媒体滤镜):
    • 这类滤镜可以同时处理音频和视频数据。
    • 它们至少有一个音频输入、一个视频输入和相应的输出。
    • 比如 帧率转换滤镜 fps、字幕滤镜 subtitles、视频稳定滤镜 vidstabdetectvidstabtransform配合使用  音视频同步滤镜 synchronize  音视频混合滤镜 amixjoin 封面图片滤镜 thumbnail  色彩转换滤镜 colorspace等。
    • #视频帧率转为 25 帧每秒
      -filter "fps=25"
      #添加 subtitles.srt 字幕文件
      -vf "subtitles=subtitles.srt"
      #校正音频与视频之间的同步问题  修正 0.1 秒的音视频偏移
      -filter "synchronize=audio_drift=0.1" 
      #生成视频的封面图
      -filter "thumbnail" 
      #改变视频的色彩空间  将视频转为 sRGB 色彩空间
      -filter "colorspace=srgb"
      
      

    • 视频稳定滤镜 vidstabdetect 滤镜用于检测视频中的抖动,并生成一个transform_vectors.trf 文件记录这些变换息。
      vidstabtransform 滤镜读取 transform_vectors.trf 文件,并应用这些变换来稳定视频画面

      • # 第一步: 使用 vidstabdetect 检测视频的抖动
        #-f null - 的作用就是:不输出任何实际的媒体文件而是将处理后的视频/音频数据直接输出到终端
        ffmpeg -i input.mp4 
        -vf 
           vidstabdetect=shakiness=10:accuracy=15:temporal_lp=5:tripod=1
        -f null -
        # 第二步: 使用 vidstabtransform 应用校正
        ffmpeg -i input.mp4 
        -vf 
        vidstabtransform=input="transform_vectors.trf"
        ,unsharp -c:v libx264 -crf 20 output.mp4
        
        
    • 音视频混合滤镜 amix 和 join 。amix 滤镜用于将两个音频流混合成一个输出流 [aout]join 滤镜则将视频流 [0:v] 和音频流 [1:a] 组合成一个输出视频 [outv] 和输出音频 [outa]。最后使用 -map 参数将这些输出流映射到最终的输出文件中

    • #音视频混合滤镜 amix 和 join
      # 将两个音频流混合成一个
      ffmpeg -i audio1.mp3 -i audio2.mp3 
      -filter_complex 
          "[0:a][1:a]amix=inputs=2[aout]" 
      -map "[aout]" output.mp3
      
      # 将视频和音频流组合成一个
      ffmpeg -i video.mp4 -i audio.mp3 
      -filter_complex 
          "[0:v][1:a]join[outv][outa]" 
      -map "[outv]" -map "[outa]" output.mp4
  • Sink Filters(终端滤镜):

    • 这类滤镜没有任何输出,只有输入。这些滤镜可以将视频或音频数据直接输出到终端,而不需要生成媒体文件。Sink Filters 可以让您在不生成中间媒体文件的情况下,直接在终端中查看和处理视频/音频数据。它们在调试和分析场景中非常有用。
    • 比如-f null -不输出任何实际的媒体文件,而是将处理后的视频/音频数据直接输出到终端。
    • #不播放,但保存一个包含水印的预览图像
      ffmpeg -i input.mp4 
      -vf 
      "drawtext=fontfile=/path/to/font.ttf:text='Hello World'
      :x=(w-tw)/2:y=h-(2*lh)"
       -vframes 1 preview.jpg
      
      #输出通过管道传输到其他视频播放器进行预览
      ffmpeg -i input.mp4 
      -vf "drawtext=fontfile=/path/to/font.ttf:text='Hello World'
      :x=(w-tw)/2:y=h-(2*lh)" 
      -f null - | my_video_player

       除了source和sink filter,其他 filter 都至少有一个输入、至少一个输出。

FFmpeg 滤镜表达式中的常用变量

变量描述
x从左上角水平方向的像素个数
y从左上角垂直方向的像素个数
iw输入宽度
ih输入高度
ow输出(裁剪)宽度,默认值为 iw
oh输出(裁剪)高度,默认值为 ih
a输入显示宽比,等于 iw/ih
sar输入样本纵横比
dar输出显示纵横比
hsub水平色度子样本值
vsub垂直色度子样本值
n当前帧的索引(从 0 开始)
t当前时间(以秒为单位)
pts当前帧的时间戳(以时间基准单位表示)
duration输入流的持续时间(以时间基准单位表示)
clip当前帧的剪辑信息(例如裁剪区域)
frame当前帧的帧信息
key当前帧是否为关键帧(1 表示是,0 表示否)
mod当前帧的帧数对指定值的余数

 重要指令命令

语法: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 输入(前景窗口)高度

视频裁剪crop

        将输入视频帧的宽度和高度从x和y值表示的位置裁剪到指定的宽度和高度; x 和y是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。 如果使用了可选的keep_aspect参数,将会改变输出SAR(样本宽比)以补偿新的DAR(显 示长宽比)

语法:

crop=
ow
[
    :oh
        [
            :x
                [:y
                    [
                        :keep_aspect
                    ]
                ]
       ]
]

示例:

#keep_aspect 保持纵横比裁剪  只能设置成 1 或 0  
#裁剪右上
ffplay -i input.mp4 -vf crop=iw/2:ih/2:iw/2:0:1
#右下
ffplay -i input.mp4 -vf crop=iw/2:ih/2:iw/2:ih/2:0

#中轴
ffplay -i input.mp4 -vf crop=in_h
#中心 不提供 x 和 y 参数默认居中
ffplay -i input.mp4 -vf crop=2/3*in_w:2/3*in_h
ffplay -i input.mp4 -vf 
"crop=2/3*in_w:2/3*in_h:(in_w-2/3*in_w)/2:(in_h-2/3*in_h)/2"

字体水印 drawtext

参数如下:

参数描述示例
text要显示的水印文本text='你的水印文本'
x文本的 x 坐标x=10
可以使用表达式,例如:x=W-tw-10
y文本的 y 坐标y=10
可以使用表达式,例如:y=H-th-10
fontsize设置文本字体大小fontsize=24
fontcolor设置文本颜色fontcolor=white
可以使用十六进制颜色代码,例如:#FFFFFF
box是否为文本添加背景框(1 表示添加,0 表示不添加)box=1
boxcolor设置背景框颜色和透明度boxcolor=black@0.5
shadowcolor设置文本阴影颜色shadowcolor=black
shadowx设置阴影的 x 坐标偏移shadowx=1
shadowy设置阴影的 y 坐标偏移shadowy=1
红色字体 黑色轮廓 白色边框 W 和 H 代表的是当前视频帧的宽度和高度 tw为文本纸张宽高
ffplay -i input.mp4 -vf         \
"drawtext=fontsize=24
:fontfile='C:/Windows/Fonts/等线.ttf'     \  
:text='C9 程序猿'        \
:x=W-tw-10                    \  x 文本距离右边缘 10 像素。
:y=H-th-10                  \ 文本的 y 坐标为视频高度减去文本高度再减去 10 像素     
:fontcolor=red               \         
:box=1:boxcolor=black@0.5    \
:shadowcolor=white            \
:shadowx=1:shadowy=1"         \
:alpha=0.5        \ 透明度

举例 

1.四角位置

#右下角
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile='C:/Windows/Fonts/simsun.ttc':text='C9 程序猿':x=W-tw-10:y=H-th-10:fontcolor=red:box=1:boxcolor=white@0.5:shadowcolor=black:shadowx=1:shadowy=1"

#左上角
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile='C:/Windows/Fonts/simsun.ttc':text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':x=0:y=0:fontcolor=red:box=1:boxcolor=white@0.5:shadowcolor=black:shadowx=1:shadowy=1"

#左下角
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile='C:/Windows/Fonts/simsun.ttc':text='@C9 程序猿':x=0:y=H-th-10:fontcolor=red:box=1:boxcolor=white@0.5:shadowcolor=black:shadowx=1:shadowy=1:alpha=0.5"

 2.文字水印以本地时间作为水印内容

text='%{localtime\:%Y\-%m\-%d %H-%M-%S}'
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile='C:/Windows/Fonts/simsun.ttc':text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':x=0:y=0:fontcolor=red:box=1:boxcolor=white@0.5:shadowcolor=black:shadowx=1:shadowy=1"

 注意在使用ffmpeg转码存储到文件时需要加上-re,否则时间不对。

ffmpeg -re -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=gree n:box=1:boxcolor=yellow" out.mp4

 3.定时显示水印,定时不显示水印

#每3秒钟显示一次文字水印
:enable=lt(mod(t\,3)\,1)" 
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile='C:/Windows/Fonts/simsun.ttc':text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':x=0:y=0:fontcolor=red:box=1:boxcolor=white@0.5:shadowcolor=black:shadowx=1:shadowy=1:enable=lt(mod(t\,3)\,1) "

在使用ffmpeg转码存储到文件时需要加上-re,否则时间不对。

4.跑马灯效果

x=mod(100*t\,w):y=abs(sin(t))*h*0.7
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile='C:/Windows/Fonts/simsun.ttc':text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':x=mod(100*t\,w):y=abs(sin(t))*h*0.7:fontcolor=red:box=1:boxcolor=white@0.5:shadowcolor=black:shadowx=1:shadowy=1:enable=lt(mod(t\,3)\,1) "

 图片水印 movie

图片水印和文字水印有很多参数可以复用,可以根据上下文尝试。下面是主要常用的:

ffmpeg -i input.mp4 
-vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]" 
output.mp4 
参数描述示例
x水印的 x 坐标(水平位置)x='if(gte(t,5), W-w-10, 0)'(在5秒后显示在右下角)
y水印的 y 坐标(垂直位置)

H-h-10 (右下角,距离底边缘10像素)

  • W:主视频的宽度
  • H:主视频的高度
  • w:叠加视频/img的宽度
  • h:叠加视频/img的高度
enable控制水印显示的条件表达式enable='between(t,10,20)'
scale调整水印的大小scale=100:100 (将水印缩放到100x100像素)
format设置输出格式,通常用于调整透明度format=yuva420p
shortest如果设置为 1,输出视频将根据输入流中最短的流长度进行裁剪。overlay=W-w-10:H-h-10:shortest=1
format指定输出格式,可以用于控制透明度和颜色通道。format=auto
alpha设置水印的 alpha 通道,可以用来控制透明度。alpha=0.5 (50%透明)
repeat重复水印图像的次数或设置其显示模式。repeat=0(永远显示)
draw可以用于绘制效果,如圆形或矩形背景。draw=1

 

使用示例

#根据上图可知 右上角
ffplay -i input.mp4 -vf "movie=\'logo2.png\'[watermark];[in][watermark]
overlay=main_w-overlay_w-10:10[out]"
#左下角
ffplay -i input.mp4 -vf "movie=\'logo2.png\'[watermark];[in][watermark]
overlay=10:main h-overlay_h-10[out]"


#生成watermark水印图层,然后与in原始帧叠加输出out 跑马灯效果
ffplay -i input.mp4 
-vf "movie=\'logo2.png\'[watermark];  
[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"


#logo旋转效果
# [1:v]:选择第二个输入 rotate:旋转 a='t*PI' a旋转角度t时间PI是Π 
    # rotw 和 roth内置api计算旋转后的尺寸 
        #ow='rotw(PI/2)-50':oh='rotw(PI/2)-50'可控制图片大小
    # fillcolor='none'设置旋转后的空白区域为透明。
    # [out]:将旋转后的图片输出为 [out] 流
# [0:v][out]选择第一个输入视频流(0)和图片流(out)叠加(overlay)
# shortest=1:以最短的输入流结尾
ffmpeg -i time.mp4 -loop 1 -i D:\\a.jpg -filter_complex \
[1:v]rotate=a='t*PI':ow='rotw(PI/4)':oh='roth(PI/4)':fillcolor='none'[out], \
[0:v][out]overlay=x=100:y=100:shortest=1 output.mp4
ffplay -i input.mp4 -vf "movie=\'logo2.png\'[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"

ffplay -i input.mp4 -vf "movie=\'logo2.png\'[watermark];[in][watermark]overlay=main_w-overlay_w-10:10[out]"

ffmpeg -i time.mp4 -loop 1 -i D:\\a.jpg -filter_complex [1:v]rotate=a='t*PI':ow='rotw(PI/4)':oh='roth(PI/4)':fillcolor='none'[out],[0:v][out]overlay=x=100:y=100:shortest=1  output.mp4

#左下角
ffmpeg -i .\time.mp4 -loop 1 -i .\a.jpg -ss 10 -t 5 -filter_complex [1:v]rotate=a='t*PI':ow='rotw(PI/2)':oh='rotw(PI/2)':fillcolor='none'[out],[0:v][out]overlay=10:main_h-overlay_h-10:shortest=1 output.mp4

 

 

画中画命令

首先,我得明白什么是画中画。画中画就是在视频的一个角落或者某个位置,嵌入另一个视频或者图片,形成一个小窗口,这样可以在观看主视频的同时看到另一个内容。

常见命令行参数:

参数描述示例
-i input.mp4输入主视频文件-i main_video.mp4
-i overlay.mp4输入叠加视频文件(画中画视频)-i pip_video.mp4
-filter_complex使用复杂滤镜的标签,允许多输入和输出-filter_complex
overlay=x:y设置叠加视频的位置,xy 为偏移量overlay=W-w-10:H-h-10
output.mp4输出文件名

output.mp4

eof_action遇到eof表示时的处理方式,默认为重复

repeat(值为0):重复前一帧

endcall(值为 1):停止所有的流

pass(值为2):保留主图层

shortest 终止最短的视频时全部终止默认false
format设置output的像素格式,默认为yuv420

yuv420 (值为0)

yuv422 (值为1)

yuv444 (值为2)

rgb (值为3)

示例命令

#1视频中小视频
ffplay -i input.mp4 -vf 
"movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20
:eof_action=1:shortest =1:format=3[out]"

#放大 小视频
ffplay -i input.mp4 -vf 
"movie=sub_320x240.mp4,scale=640x480[sub];[in][sub]overlay=x=20:y=20
:eof_action=1:shortest =1:format=3[out]"

#再结合上下文跑马灯
ffplay -i input.mp4 -vf 
"movie=sub_320x240.mp4,scale=640x480[sub];
[in][sub]
overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7
:eof_action=1:shortest =1:format=3[out]"
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1:shortest =1:format=3[out]"

ffplay -i input.mp4 -vf "movie=sub_320x240.mp4,scale=640x480[sub];[in][sub]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7:eof_action=1:shortest =1:format=3[out]"

 

视频多宫格命令

多宫格(也称为视频网格或画中画组合)是一种将多个视频或图片排列在一个画面中的效果。

使用示例

#2x2 多宫格(4 个视频)
#hstack:将两个视频水平排成一行。vstack:将两行视频垂直堆叠。
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex \
"[0:v]scale=640:360[vid1]; \
 [1:v]scale=640:360[vid2]; \
 [2:v]scale=640:360[vid3]; \
 [3:v]scale=640:360[vid4]; \
 [vid1][vid2]hstack[top]; \
 [vid3][vid4]hstack[bottom]; \
 [top][bottom]vstack" output.mp4

#动态调整视频位置
#xstack:动态调整视频位置。layout=0_0|w0_0|0_h0|w0_h0:定义每个视频的位置:
    #0_0:第一个视频在左上角。
    #w0_0:第二个视频在右上角。
    #0_h0:第三个视频在左下角。
    #w0_h0:第四个视频在右下角。
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex \
"[0:v]scale=640:360[vid1]; \
 [1:v]scale=640:360[vid2]; \
 [2:v]scale=640:360[vid3]; \
 [3:v]scale=640:360[vid4]; \
 [vid1][vid2][vid3][vid4]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0" output.mp4

#1 大 + 3 小多宫格
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex \
"[0:v]scale=960:540[vid0]; \
 [1:v]scale=320:180[vid1]; \
 [2:v]scale=320:180[vid2]; \
 [3:v]scale=320:180[vid3]; \
 [vid1][vid2][vid3]hstack=inputs=3[small]; \
 [vid0][small]vstack=inputs=2" output.mp4



#3x3 多宫格(9 个视频)
#hstack=inputs=3:水平拼接 3 个视频.vstack=inputs=3:垂直拼接 3 行视频。
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -i input5.mp4 -i input6.mp4 -i input7.mp4 -i input8.mp4 -i input9.mp4 -filter_complex \
"[0:v]scale=426:240[vid1]; \
 [1:v]scale=426:240[vid2]; \
 [2:v]scale=426:240[vid3]; \
 [3:v]scale=426:240[vid4]; \
 [4:v]scale=426:240[vid5]; \
 [5:v]scale=426:240[vid6]; \
 [6:v]scale=426:240[vid7]; \
 [7:v]scale=426:240[vid8]; \
 [8:v]scale=426:240[vid9]; \
 [vid1][vid2][vid3]hstack=inputs=3[top]; \
 [vid4][vid5][vid6]hstack=inputs=3[mid]; \
 [vid7][vid8][vid9]hstack=inputs=3[bottom]; \
 [top][mid][bottom]vstack=inputs=3" output.mp4



ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4  -filter_complex "[0:v]scale=640:360[v1];[1:v]scale=640:360[v2];[2:v]scale=640:360[v3];[3:v]scale=640:360[v4];[v1][v2]hstack[top];[v3][v4]hstack[bottom];[top][bottom]vstack" outmp4.mp4

 

混合音频

#[0:a][1:a][2:a][3:a]amix=inputs=4[a]
#-map "[v]" -map "[a]" :选择 [v] 和 [a] 作为输出文件的视频流和音频流。
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex \
"[0:v]scale=640:360[vid1]; \
 [1:v]scale=640:360[vid2]; \
 [2:v]scale=640:360[vid3]; \
 [3:v]scale=640:360[vid4]; \
 [vid1][vid2]hstack[top]; \
 [vid3][vid4]hstack[bottom]; \
 [top][bottom]vstack[v]; \
 [0:a][1:a][2:a][3:a]amix=inputs=4[a]" \
-map "[v]" -map "[a]" output.mp4 

添加背景和边框 

使用时加上 :shortest=1 不然会一直刷帧不会结束。

#
#pad=660:370:10:10:white:为每个视频添加 10 像素的白色边框。
#color=black:1280x720:创建一个黑色背景。
#overlay=0:0:将多宫格叠加到背景上。
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -f lavfi -i color=black:1280x720 -filter_complex 
"[0:v]scale=640:360,pad=660:370:10:10:white[vid1]; \
 [1:v]scale=640:360,pad=660:370:10:10:white[vid2]; \
 [2:v]scale=640:360,pad=660:370:10:10:white[vid3]; \
 [3:v]scale=640:360,pad=660:370:10:10:white[vid4]; \
 [vid1][vid2]hstack[top]; \
 [vid3][vid4]hstack[bottom]; \
 [top][bottom]vstack[grid]; \
 [4:v][grid]overlay=0:0:shortest=1" output.mp4
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -f lavfi -i color=black:1280x720 -filter_complex "[0:v]scale=640:360,pad=660:370:10:10:white[vid1]; [1:v]scale=640:360,pad=660:370:10:10:white[vid2]; [2:v]scale=640:360,pad=660:370:10:10:white[vid3]; [3:v]scale=640:360,pad=660:370:10:10:white[vid4]; [vid1][vid2]hstack[top]; [vid3][vid4]hstack[bottom]; [top][bottom]vstack[grid]; [4:v][grid]overlay=0:0:shortest=1" output.mp4

多宫格推流

防止视频时间太短,使用stream_loop -1 循环播放

#多宫格推流 stream_loop -1 循环播放
ffmpeg -stream_loop -1 -i 1.mp4 -i 2.mp4 -stream_loop -1 -i 3.mp4 -i 4.mp4 -filter_complex \
"[0:v]scale=640:360[vid1]; \
 [1:v]scale=640:360[vid2]; \
 [2:v]scale=640:360[vid3]; \
 [3:v]scale=640:360[vid4]; \
 [vid1][vid2][vid3][vid4]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[out]" 
-map"[out]"
-c:v libx264 -preset veryfast -tune zerolatency 
-f flv rtmp://192.168.1.25/live/c9
 ffmpeg  -stream_loop -1 -i 1.mp4 -i 2.mp4  -stream_loop -1 -i 3.mp4 -i 4.mp4   -filter_complex "[0:v]scale=640:360[vid1]; [1:v]scale=640:360[vid2]; [2:v]scale=640:360[vid3]; [3:v]scale=640:360[vid4]; [vid1][vid2][vid3][vid4]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[out]" -map "[out]" -c:v libx264 -preset veryfast -tune zerolatency -f flv rtmp://192.168.1.25/live/c9
ffplay rtmp://192.168.1.25/live/c9

 

学习资料分享

0voice · GitHub


http://www.kler.cn/a/467874.html

相关文章:

  • yolo目标检测之摄像头检测
  • vulkan从小白到专家——VulkanSwapChain
  • 《Rust权威指南》学习笔记(一)
  • Linux一些问题
  • Android 系统 `android.app.Application` 类的深度定制
  • Jellyfin播放卡顿,占CPU的解决方法
  • 数学常用术语作用reminder
  • 供应链系统设计-供应链中台系统设计(七)- 商品中心设计篇
  • 大白话拆解——多线程中关于死锁的一切(七)(已完结)
  • SpringBoot中常用的 Redis 命令实现
  • Linux Red Hat 7.9 Server安装GitLab
  • 【Ubuntu】 Ubuntu22.04搭建NFS服务
  • ARM CCA机密计算安全模型之固件更新
  • 自定义有序Map
  • 【Java基础】力扣3、4
  • java项目之读书笔记共享平台(源码+文档)
  • ros常用命令记录
  • GOGOGO 抽象
  • 「Mac畅玩鸿蒙与硬件51」UI互动应用篇28 - 模拟记账应用
  • 大数据技术(七)—— HBase数据结构与架构