使用ffmpeg 将图片合成为视频,填充模糊背景,并添加两段音乐

1.输入3张图片,每张播放一次,播放两秒,视频分辨率设置为1920:1080,每张图片前0.3秒淡入,后0.3秒淡出,图片宽高比不变,用白色填充空白区域

ffmpeg -loop 1 -t 2 -i "img1.jpg" \-loop 1 -t 2 -i "img2.jpg" \-loop 1 -t 2 -i "img3.jpg" \-filter_complex "[0:v]scale=1920:1080:force_original_aspect_ratio=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:color=white,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st=1.7:d=0.3[img1];[1:v]scale=1920:1080:force_original_aspect_ratio=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:color=white,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st=1.7:d=0.3[img2];[2:v]scale=1920:1080:force_original_aspect_ratio=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:color=white,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st=1.7:d=0.3[img3];[img1][img2][img3]concat=n=3:v=1:a=0[vfinal]" \-map "[vfinal]" \-c:v libx264 \-preset slow \-profile:v high \-crf 18 \-pix_fmt yuv420p \-movflags +faststart \-r 30 \output.mp4

2.输入一张图片,视频分辨率为1920:1080,生成两张图片,一张模糊用作背景,一张前端宽高比保持一致,生成5秒的视频

ffmpeg -loop 1 -t 5 -i img1.jpg \-vf "split=2[original][blurred];[blurred]scale=1920:1080,boxblur=20[blurred];[original]scale=1920:1080:force_original_aspect_ratio=1[original];[blurred][original]overlay=(W-w)/2:(H-h)/2,setsar=1" \-c:v libx264 \-s 1920x1080 \output222.mp4

3.输入3张图片,设置视频分辨率为1920:1080,每张图片生成模糊背景和一致宽高比前景

ffmpeg -loop 1 -t 5 -i "img1.jpg" \-loop 1 -t 5 -i "img2.jpg" \-loop 1 -t 5 -i "img3.jpg" \-filter_complex "[0:v]split=2[original][blurred];[blurred]scale=1920:1080,boxblur=20[blurred];[original]scale=1920:1080:force_original_aspect_ratio=1[original];[blurred][original]overlay=(W-w)/2:(H-h)/2,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st=4.7:d=0.3[img1];[1:v]split=2[original][blurred];[blurred]scale=1920:1080,boxblur=20[blurred];[original]scale=1920:1080:force_original_aspect_ratio=1[original];[blurred][original]overlay=(W-w)/2:(H-h)/2,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st=4.7:d=0.3[img2];[2:v]split=2[original][blurred];[blurred]scale=1920:1080,boxblur=20[blurred];[original]scale=1920:1080:force_original_aspect_ratio=1[original];[blurred][original]overlay=(W-w)/2:(H-h)/2,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st=4.7:d=0.3[img3];[img1][img2][img3]concat=n=3:v=1:a=0[vfinal]" \-map "[vfinal]" \-c:v libx264 \-preset slow \-profile:v high \-crf 18 \-pix_fmt yuv420p \-movflags +faststart \-r 30 \output444.mp4

4.输入3张图片,设置视频分辨率为1920:1080,每张图片生成模糊背景和一致宽高比前景,添加两段音频合成视频

ffmpeg -loop 1 -t 5 -i "img1.jpg" \-loop 1 -t 5 -i "img2.jpg" \-loop 1 -t 5 -i "img3.jpg" \-i "搀扶.mp3" \-i "青花瓷.mp3" \-filter_complex "[0:v]split=2[original][blurred];[blurred]scale=1920:1080,boxblur=20[blurred];[original]scale=1920:1080:force_original_aspect_ratio=1[original];[blurred][original]overlay=(W-w)/2:(H-h)/2,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st=4.7:d=0.3[img1];[1:v]split=2[original][blurred];[blurred]scale=1920:1080,boxblur=20[blurred];[original]scale=1920:1080:force_original_aspect_ratio=1[original];[blurred][original]overlay=(W-w)/2:(H-h)/2,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st=4.7:d=0.3[img2];[2:v]split=2[original][blurred];[blurred]scale=1920:1080,boxblur=20[blurred];[original]scale=1920:1080:force_original_aspect_ratio=1[original];[blurred][original]overlay=(W-w)/2:(H-h)/2,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st=4.7:d=0.3[img3];[img1][img2][img3]concat=n=3:v=1:a=0[vfinal];[3:a][4:a]amix=inputs=2[afinal]" \-map "[vfinal]" \-map "[afinal]" \-c:v libx264 \-c:a aac \-b:a 192k \-preset slow \-profile:v high \-crf 18 \-pix_fmt yuv420p \-movflags +faststart \-r 30 \-t 15 \output666.mp4

详细解释

输入部分
  • -loop 1 -t 5 -i "img1.jpg":将图片 img1.jpg 作为输入,循环显示 5 秒。

  • -loop 1 -t 5 -i "img2.jpg":将图片 img2.jpg 作为输入,循环显示 5 秒。

  • -loop 1 -t 5 -i "img3.jpg":将图片 img3.jpg 作为输入,循环显示 5 秒。

  • -i "搀扶.mp3":将音频文件 搀扶.mp3 作为输入。

  • -i "青花瓷.mp3":将音频文件 青花瓷.mp3 作为输入。

滤镜链部分
  1. 处理每张图片

    • [0:v]split=2[original][blurred]:将输入流分成两个分支,分别标记为 [original][blurred]

    • [blurred]scale=1920:1080,boxblur=20[blurred]

      • [blurred] 流缩放到 1920x1080

      • [blurred] 流应用 boxblur 滤镜,模糊程度为 20。

    • [original]scale=1920:1080:force_original_aspect_ratio=1[original]

      • [original] 流缩放到 1920x1080,保持原始宽高比。

    • [blurred][original]overlay=(W-w)/2:(H-h)/2,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st=4.7:d=0.3[img1]

      • [original] 流覆盖到 [blurred] 流上,居中对齐。

      • 使用 setsar=1 设置采样宽高比为 1:1

      • 将像素格式设置为 yuv420p

      • 添加淡入效果:fade=t=in:st=0:d=0.3,在开始时持续 0.3 秒。

      • 添加淡出效果:fade=t=out:st=4.7:d=0.3,在结束前 0.3 秒。

      • 将处理后的流标记为 [img1]

    同样的处理步骤应用于 img2.jpgimg3.jpg,分别标记为 [img2][img3]

  2. 拼接处理后的流

    • [img1][img2][img3]concat=n=3:v=1:a=0[vfinal]:将三个处理后的流拼接在一起,生成最终的视频流 [vfinal]

  3. 混合音频

    • [3:a][4:a]amix=inputs=2[afinal]:将两个音频流混合,生成最终的音频流 [afinal]

输出部分
  • -map "[vfinal]":指定输出流为 [vfinal]

  • -map "[afinal]":指定输出流为 [afinal]

  • -c:v libx264:使用 H.264 编码器。

  • -c:a aac:使用 AAC 编码器。

  • -b:a 192k:设置音频比特率为 192 kbps。

  • -preset slow:使用 slow 预设,以获得更好的压缩效果。

  • -profile:v high:使用 high 配置文件。

  • -crf 18:设置质量为 18(较低的值表示更高的质量)。

  • -pix_fmt yuv420p:设置像素格式为 yuv420p

  • -movflags +faststart:优化视频文件,使其更适合网络播放。

  • -r 30:设置帧率为 30 帧/秒。

  • -t 15:设置输出视频的总时长为 15 秒。

  • output666.mp4:输出文件名。

可以去官网下载ffmpeg

输入文件下载

通过网盘分享的文件:图片生成视频.rar
链接: https://pan.baidu.com/s/1Vc4JbnCjvP_PFHwF-TyfvA?pwd=fiy1 提取码: fiy1

5.使用java生成命令行,并调用ffmpeg执行

package com.ruoyi.image.utils.ffmpeg.dto;import lombok.Data;import java.util.List;@Data
public class CommandLineParameterDto {//视频宽private String videoWidth;//视频高private String videoHigh;//背景音乐private String backgroundMusicUrl;//朗读音乐private String recitationMp3Url;//图片listprivate List<ImgDto> imgList;
}
package com.ruoyi.image.utils.ffmpeg.dto;import lombok.Data;@Data
public class ImgDto {//图片地址private String imgUrl;//图片播放时间private Integer time;
}
package com.ruoyi.image.utils.ffmpeg;import com.ruoyi.common.core.utils.uuid.UUID;
import com.ruoyi.image.utils.ffmpeg.dto.CommandLineParameterDto;
import com.ruoyi.image.utils.ffmpeg.dto.ImgDto;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;public class FfmpegUtil {public static String ffmpegPath = "/opt/ffmpeg/bin/ffmpeg";static {String envPath = System.getenv("FFMPEG_PATH");if (envPath != null && !envPath.trim().isEmpty()) {ffmpegPath = envPath;}}public static String getCreateVideo(CommandLineParameterDto dto){if(dto == null){return null;}if(dto.getImgList() == null || dto.getImgList().isEmpty()){return null;}UUID uuid = UUID.randomUUID();String uuidString = uuid.toString().replace("-", "");String tempDir = System.getProperty("java.io.tmpdir");String out=tempDir+uuidString+".mp4";int sum = dto.getImgList().stream().mapToInt(i -> i.getTime()).sum();StringBuffer stringBuffer=new StringBuffer();stringBuffer.append(ffmpegPath+ " ");for (ImgDto dto1:dto.getImgList()){stringBuffer.append("-loop 1 -t "+dto1.getTime()+" -i "+dto1.getImgUrl()+" ");}stringBuffer.append("-i "+dto.getBackgroundMusicUrl()+" ");stringBuffer.append("-i "+dto.getRecitationMp3Url()+" ");StringBuffer filterComplex=new StringBuffer();StringBuffer imgs=new StringBuffer();for (int i=0;i<dto.getImgList().size();i++){ImgDto imgDto = dto.getImgList().get(i);Integer time = imgDto.getTime();double v = time - 0.3d;filterComplex.append("["+i+":v]split=2[original][blurred];[blurred]scale="+dto.getVideoWidth()+":"+dto.getVideoHigh()+",boxblur=20[blurred];[original]scale="+dto.getVideoWidth()+":"+dto.getVideoHigh()+":force_original_aspect_ratio=1[original];[blurred][original]overlay=(W-w)/2:(H-h)/2,setsar=1,format=yuv420p,fade=t=in:st=0:d=0.3,fade=t=out:st="+v+":d=0.3[img"+i+"];");imgs.append("[img"+i+"]");}filterComplex.append(imgs.toString()+"concat=n="+dto.getImgList().size()+":v=1:a=0[vfinal];");filterComplex.append("["+dto.getImgList().size()+":a]["+(dto.getImgList().size()+1)+":a]amix=inputs=2[afinal];");stringBuffer.append("-filter_complex \""+filterComplex.toString()+"\" ");stringBuffer.append("-map \"[vfinal]\" ");stringBuffer.append("-map \"[afinal]\" ");stringBuffer.append("-c:v libx264 ");stringBuffer.append("-c:a aac ");stringBuffer.append("-b:a 192k ");stringBuffer.append("-preset slow ");stringBuffer.append("-profile:v high ");stringBuffer.append("-crf 18 ");stringBuffer.append("-pix_fmt yuv420p ");stringBuffer.append("-movflags +faststart ");stringBuffer.append("-r 30 ");stringBuffer.append("-t "+sum+" ");stringBuffer.append(out+" ");try {Process process = Runtime.getRuntime().exec(stringBuffer.toString());// 创建线程读取输出流new Thread(() -> {try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {String line;while ((line = reader.readLine()) != null) {System.out.println("Output: " + line);}} catch (IOException e) {e.printStackTrace();}}).start();// 创建线程读取错误流new Thread(() -> {try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {String line;while ((line = reader.readLine()) != null) {System.out.println("Error: " + line);}} catch (IOException e) {e.printStackTrace();}}).start();// 等待命令执行完成int exitCode = process.waitFor(); // 阻塞当前线程,直到命令执行完成} catch (IOException e) {throw new RuntimeException(e);}catch (InterruptedException e) {throw new RuntimeException(e);}return out;}public static void main(String[] args) {List<ImgDto> list=new ArrayList<>();ImgDto img1=new ImgDto();img1.setTime(5);img1.setImgUrl("https://mmwz.obs.cn-east-3.myhuaweicloud.com/img1.jpg");list.add(img1);ImgDto img2=new ImgDto();img2.setTime(5);img2.setImgUrl("https://mmwz.obs.cn-east-3.myhuaweicloud.com/img2.jpg");list.add(img2);CommandLineParameterDto dto=new CommandLineParameterDto();dto.setImgList(list);dto.setVideoWidth("1920");dto.setVideoHigh("1080");dto.setBackgroundMusicUrl("https://mmwz.obs.cn-east-3.myhuaweicloud.com/%E6%90%80%E6%89%B6.mp3");dto.setRecitationMp3Url("https://mmwz.obs.cn-east-3.myhuaweicloud.com/%E9%9D%92%E8%8A%B1%E7%93%B7.mp3");String createVideo = getCreateVideo(dto);System.out.println(createVideo);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL技术内幕29:事件触发器tag原理解析

文章目录 0.简介1.概念说明2.tag的生成和存储2.1 tag合法性校验2.2 内存中存储2.3 持久化存储 3.tag的触发 0.简介 在上一篇文章中中&#xff0c;我们介绍了PG中的两种触发器&#xff0c;即适合于DML的普通触发器和对于DDL的事件触发器&#xff0c;其中事件触发器与常规的 DML…

mysql 导入很慢,如何解决

精选 原创 码出财富2025-04-14 17:35:14博主文章分类&#xff1a;数据库©著作权 文章标签mysql数据库用户名文章分类MySQL数据库yyds干货盘点阅读数184 导入大型 SQL 文件到 MySQL 数据库时&#xff0c;速度可能会受到影响。以下是一些优化方法和建议&#xff0c;帮助你…

多物理场耦合低温等离子体装置求解器PASSKEy2

文章目录 PASSKEy2简介PASSKEY2计算流程PASSKEy2 中求解的物理方程电路模型等离子体模型燃烧模型 PASSKEy2的使用 PASSKEy2简介 PASSKEy2 是在 PASSKEy1 的基础上重新编写的等离子体数值模拟程序。 相较于 PASSKEy1&#xff0c; PASSKEy2 在具备解决低温等离子体模拟问题的能力…

保姆级zabbix监控jmx、数据库和网络监控(SNMP)

前言 在当今数字化时代&#xff0c;企业IT基础设施的稳定性与性能直接关系到业务连续性和用户体验。随着系统复杂性的不断增加&#xff0c;单一维度的监控已难以满足全面运维需求。Zabbix作为一款功能强大的开源监控解决方案&#xff0c;通过整合JMX&#xff08;Java Manageme…

复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航

作者&#xff1a; Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1单位&#xff1a; 1 ^{1} 1乔治梅森大学计算机科学系&#xff0c; 2 ^{2} 2美国陆军研究实验室&…

SharpMap与TerraLib:C#与C++开源GIS库

大家好&#xff0c;今天为大家介绍的软件是SharpMap&#xff1a;一款专为了C#&#xff08;.NET&#xff09;环境设计的开源地图和空间数据处理库&#xff1b;TerraLib&#xff1a;一款由C编写、支持多种数据库的开源的GIS软件库。 下面&#xff0c;我们将从两个开源软件的主要…

音视频学习 - MP3格式

环境 JDK 13 IDEA Build #IC-243.26053.27, built on March 16, 2025 Demo MP3Parser MP3 MP3全称为MPEG Audio Layer 3&#xff0c;它是一种高效的计算机音频编码方案&#xff0c;它以较大的压缩比将音频文件转换成较小的扩展名为.mp3的文件&#xff0c;基本保持源文件的音…

Unity中数据和资源加密(异或加密,AES加密,MD5加密)

在项目开发中&#xff0c;始终会涉及到的一个问题&#xff0c;就是信息安全&#xff0c;在调用接口&#xff0c;或者加载的资源&#xff0c;都会涉及安全问题&#xff0c;因此就出现了各种各样的加密方式。 常见的也是目前用的最广的加密方式&#xff0c;分别是&#xff1a;DE…

部署本地deepseek并在调用的详细步骤以及解决一些可能出现的问题(Windows,Linux, WSL)

打开Ollama官网&#xff1a;https://ollama.com/ 直接下载Ollama并且安装好Ollama、这时候就能看到app里多了个ollama&#xff0c;但是我们不用打开它 打开Windows Powershell&#xff1a; ollama run deepseek-r1:1.5b 7b 8b 14b 32b 70b 根据自己的电脑配置和需求更换不同的…

【KWDB 创作者计划】_嵌入式硬件篇---寄存器与存储器截断与溢出

文章目录 前言一、寄存器与存储器1. 定义与基本概念寄存器(Register)位置功能特点存储器(Memory)位置功能特点2. 关键区别3. 层级关系与协作存储层次结构协作示例4. 为什么需要寄存器性能优化指令支持减少总线竞争5. 其他寄存器类型专用寄存器程序计数器(PC)栈指针(SP)…

小白自学python第二天

学习python的第二天 一、判断语句 1、布尔类型和比较运算符 1、布尔类型 表示现实生活中的逻辑&#xff0c;真&#xff08;True&#xff0c;用数字1表示&#xff09;和假&#xff08;False&#xff0c;用数字0表示&#xff09; 2、布尔类型变量的定义 变量的名称 布尔类…

linux基础操作1------(文件命令)

一.前言 我们本章开始讲解linux&#xff0c;我们对于linux得有重要的认识&#xff0c;比如项目部署等等&#xff0c;都会用到linux&#xff0c;今天我们就开始linux的学习&#xff0c;我们需要准备的工具有vmware和xshell&#xff0c;而这里我就不教大家虚拟机的安装以及xshel…

编码问题整合

一、windows系统编码 查看编码命令&#xff1a;chcp - 936 GBK - 65001 UTF-8 - 437 英文修改系统编码 1、控制面板修改 需管理员权限-Windows 10/11进入 控制面板 > 区域 > 管理 > 更改系统区域设置勾选 Beta版: 使用Unicode UTF-8提供全球语言支持 → 重启生效修…

如何配置Spark

1.上传spark安装包到某一台机器&#xff08;自己在finaShell上的机器&#xff09;。 2.解压。 把第一步上传的安装包解压到/opt/module下&#xff08;也可以自己决定解压到哪里&#xff09;。对应的命令是&#xff1a;tar -zxvf 安装包 -C /opt/module 3.重命名。进入/opt/mo…

Redis 完整配置模板

一、基础连接配置&#xff08;单机模式&#xff09; 基础参数&#xff08;适用Spring Boot&#xff09; spring:redis:host: 127.0.0.1port: 6379password: your_passworddatabase: 0 # 默认DB索引timeout: 2000ms # 全局操作超时时间二、连接池参数&#xff08;通用核心配…

边界凸台建模与实例

文章目录 边界凸台特征耳机案例瓶子 边界凸台特征 两侧对称拉伸最上面的圆柱 同过两点一基准面画草图&#xff0c;在基准面上画椭圆 隐藏无关的实体和草图&#xff0c;以便椭圆的端点能与线给穿透约束&#xff0c;下面的点与下面的线也给穿透&#xff0c;短轴长给35&#xff08…

河北省大数据应用创新大赛样题

** 河北省大数据应用创新大赛样题 ** 1. 在Linux下安装Java并搭建完全分布式Hadoop集群。在Linux终端执行命令“initnetwork”&#xff0c;或双击桌面上名称为“初始化网络”的图标&#xff0c;初始化实训平台网络。 【数据获取】 使用wget命令获取JDK安装包&#xff1a; “w…

【数据可视化-21】水质安全数据可视化:探索化学物质与水质安全的关联

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

DC-2寻找Flag1、2、3、4、5,wpscan爆破、git提权

一、信息收集 1、主机探测 arp-scan -l 探测同网段2、端口扫描 nmap -sS -sV 192.168.66.136 80/tcp open http Apache httpd 2.4.10 ((Debian)) 7744/tcp open ssh OpenSSH 6.7p1 Debian 5deb8u7 (protocol 2.0)这里是扫描出来两个端口&#xff0c;80和ssh&…

SQLMesh 表格对比指南:深入理解 table_diff 工具的实际应用

在数据集成和转换过程中&#xff0c;确保数据模型的一致性和准确性至关重要。SQLMesh 提供了一个强大的 table_diff 工具&#xff0c;可以帮助用户比较 SQLMesh 模型或数据库表/视图的架构和数据。本文将通过具体示例详细说明如何使用 table_diff 工具进行跨环境比较和直接比较…