[bat+ffmpeg]windows下一种基于ffmpeg和deepseek的以单张图片制作超长时间静态视频流的快速方法(倍增)

最近往b站上投稿只有音频流的视频受挫【稿件分辨率<1x10,解码失败】,于是想要以图片作为静态视频背景,再和音频流以仅拷贝的方式合并在一起

不知道为什么,我的电脑在使用单张图片(1920x1200,891kB,png)进行静态视频合成时,只有5x的速度(即想要制作24h的只有单张图片的静态视频,需要等待24/5 = 4.8h),不能满足我的需求(如果不预先生成视频流,每次都以图片和音频生成新视频的速度还是5x(音频流拷贝速度极快,所以整体速度取决于生成视频流的速度),不能接受这样的速度)

2(4AHSW89L@VI0AVXQ@26AO

 

于是和deepseek热烈讨论了几个小时,得到了两种方案:

1.使用 lavfi 生成纯色帧 :

ffmpeg -f lavfi -i color=c=black -t 86400 -y output.mkv

ffmpeg -f lavfi -i color=c=black:s=1920x1080:r=1:d=86400 -c:v libx264 -preset ultrafast -pix_fmt yuv420p -y template_24h.h264 (这个参数优化更多,速度更快)【这个已经脱离使用图片为音频补充视频流的范畴,但是可以解决只有音频流不能上传的问题,而且可以选择不预先生成模板视频流(即随着音频流的复制以纯色背景即时补充视频流),1000x的速度可以接受】

ffmpeg -f lavfi -i color=c=black -t 86400 -y output.mkv
参数简介:
ffmpeg 
-f lavali // 纯色帧生成参数
-i color=c=black //指定颜色
-t 86400 // 时长单位为秒,该条命令生成的静态视频长度为86400s=24h
-y output.mkv // 输出文件名

 

2.先生成2min(或其他长度)的基础模板,再不断自我复制流合成为更长的静态视频

@echo off
setlocal enabledelayedexpansion

set "static_image=D:\BaiduNetdiskDownload\fangzha\pic.jpg"
set "target_duration=86400" rem 24小时=86400秒
set "base_duration=300"     rem 5分钟基础片段

echo 生成24小时静态视频(倍增拼接法)...
echo.

rem 第一步:生成5分钟基础片段(最高质量设置)
ffmpeg -loop 1 -i "%static_image%" ^
       -c:v libx264 -preset veryslow -tune stillimage ^
       -crf 18 -r:v 24 -an -t %base_duration% ^
       -y "base_5min.mkv"

echo 基础5分钟片段生成完成,开始倍增拼接...

rem 第二步:指数级倍增拼接
set "current_duration=%base_duration%"
set "current_file=base_5min.mkv"
set /a iteration=1

:doubling_loop
    if !current_duration! geq %target_duration% goto complete
    
    rem 拼接两个相同片段实现时长倍增
    echo file '!current_file!' > concat_list.txt
    echo file '!current_file!' >> concat_list.txt
    
    set /a next_duration=current_duration*2
    set "next_file=segment_!next_duration!s.mkv"
    
    ffmpeg -f concat -i concat_list.txt -c copy -y "!next_file!"
    
    rem 清理上一级文件(保留最新即可)
    if not "!current_file!"=="base_5min.mkv" del "!current_file!"
    
    set "current_file=!next_file!"
    set "current_duration=!next_duration!"
    set /a iteration+=1
    
    echo 已生成: !current_duration! 秒视频(!iteration!次拼接)
    goto doubling_loop

:complete
rem 重命名为最终文件
ren "!current_file!" "24hours_video.mkv"
del concat_list.txt 2>nul

echo.
echo ========================================
echo 24小时视频生成完成!
echo 总拼接次数: %iteration%
echo 最终文件: 24hours_video.mkv
echo ========================================
pause

(来自deepseek的)关键参数解析:
ffmpeg 
-loop 1 // 固定写法,无限循环素材
-i "%static_image%" // 图片地址
-c:v libx264 -preset veryslow // x264编码
-tune stillimage // ffmpeg针对静态视频的优化参数
-crf 18 // 数字(0-50),越小视频质量越高体积越大
-r:v 24 // 每秒帧数,越小视频体积越小,不建议小于1(24小时的视频,原图片800kB,每秒24帧大约10g,每秒1帧大约1g)
-an 
-t %base_duration%
-y "base_5min.mkv"

前者速度1000x(9950x+6000hz)

image

 

后者(2000x),生成完基础模板视频后复制流速度取决于io

image

 

posted @ 2025-08-26 03:56  joy_gg  阅读(19)  评论(0)    收藏  举报