本博客中实现的画中画效果 :
执行如下命令 , 实现基础的画中画效果 ;
ffmpeg -i input.mp4 -vf "movie=input2.mp4[vedio_inner];[in][vedio_inner]overlay=x=10:y=10[out]" output.mp4
执行如下命令 , 实现画中画跑马灯效果 ;
ffmpeg -i input.mp4 -vf "movie=input2.mp4,scale=200x200[vedio_inner];[in][vedio_inner]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]" output.mp4
overlay 过滤器 可以 将多个 视频流 / 设备 / 视频文件 合并到一个 视频界面 中 ,
overlay=x=position_x:y=position_y[:options]
上述 overlay 过滤器 中的 x 和 y 参数 解析 :
x=position_x
参数 , x 是参数名称 , position_x 是实际的参数值 , 这是在输出视频中 叠加内容 的水平位置 ;y=position_y
参数 , y 是参数名称 , position_y 是实际的参数值 , 这是在输出视频中 叠加内容 的垂直位置 ;overlay 过滤器 还可以设置 若干 可选 options 参数 , 如下所示 :
在 overlay 过滤器中 , 也可以使用 之前 movie 过滤器 中介绍的四个内置参数 :
更多细节参考 【FFmpeg】Filter 过滤器 ④ ( 图片水印 - movie 过滤器 / overlay 过滤器 | movie 过滤器内置参数值简介 | 图片水印示例 ) -> movie 过滤器内置参数值简介 博客章节 , 详细介绍了上述四个参数的使用状况 ;
下面的命令中 , 使用了 movie 过滤器 和 overlay 过滤器 , 实现了画中画效果 ;
ffmpeg -i input.mp4 -vf "movie=input2.mp4[vedio_inner];[in][vedio_inner]overlay=x=10:y=10[out]" output.mp4
movie=input2.mp4[vedio_inner]
部分 用于设定 movie 过滤器 , 指定了一个输入视频文件 input2.mp4 , 加载该视频流 , 并将其命名为 vedio_inner , 这个名称可以随意命名 , 任意字符串即可 ;[in][vedio_inner]overlay=x=10:y=10[out]
部分 用于设置 overlay 过滤器 , 将 input.mp4 输入视频 和名为 vedio_inner 的视频 进行叠加 , 叠加位置 x=10 和 y=10 指定了叠加的位置为 (10, 10) 坐标 ; 执行上述命令 , 执行结果如下 :
先执行上述转换命令生成 output.mp4 输出文件 , 然后执行 ffplay output.mp4 播放 输出文件 ;
设置 eof_action 参数 , 设置 eof_action=0 选项 , 这是默认选项 , 其执行效果与上个章节的执行效果相同 ;
eof_action=1 选项是 overlay 过滤器选项 , 在 y 坐标设置后 , 使用 冒号 分隔符 进行分割设置 ;
ffmpeg -i input.mp4 -vf "movie=input2.mp4[vedio_inner];[in][vedio_inner]overlay=x=10:y=10:eof_action=1[out]" output.mp4
上述命令执行后 , 生成的视频 , 内部嵌入视频时长比外部视频时长短 , 内部视频播放结束后 , 外部视频也停止 ; ( 音频没有停止 )
设置 shortest=1 参数 与设置 eof_action=1 参数效果相同 ;
执行
ffmpeg -i input.mp4 -vf "movie=input2.mp4[vedio_inner];[in][vedio_inner]overlay=x=10:y=10:shortest=1[out]" output.mp4
命令 , 实现的画中画效果如下 , 左上角小视频播放完毕后 , 整个视频停止播放 ;
执行
ffmpeg -i input.mp4 -vf "movie=input2.mp4,scale=200x200[vedio_inner];[in][vedio_inner]overlay=x=10:y=10[out]" output.mp4
命令 , 在 movie 过滤器中 , 设置了 scale=200x200 参数 , 该参数控制加载的 input2.mp4 视频流画面设置为 200x200 像素 ,
执行效果如下 : 画中画的尺寸设置为了 200x200 像素大小 ;
执行
ffmpeg -i input.mp4 -vf "movie=input2.mp4,scale=200x200[vedio_inner];[in][vedio_inner]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]" output.mp4
命令 , 设置 x 和 y 的属性 , 其中使用了表达式 , 根据时间动态改变 嵌入视频的位置 ;
将 x 的值设置为 mod(50*t\,main_w) 实现的是 每秒 向右移动 50 像素的执行效果 ;
设置 y 的值为 abs(sin(t))*main_h\*0.7 , 这是在 y 方向以正弦函数进行运动 ;
参考 【FFmpeg】Filter 过滤器 ④ ( 图片水印 - movie 过滤器 / overlay 过滤器 | movie 过滤器内置参数值简介 | 图片水印示例 ) 3、添加图片水印 - 水印跑马灯不停移动 博客章节的 FFmpeg 表达式解析 ;
执行效果如下 : 嵌入的画中画视频有跑马灯效果 ;