使用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.pswp.cn/diannao/80483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80483.shtml
英文地址,請注明出處:http://en.pswp.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 工具進行跨環境比較和直接比較…