You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量转换嵌套子目录中的GIF为MP4并保留原帧率(支持批处理/Bash/PowerShell)

如何批量转换嵌套子目录中的GIF为MP4并保留原帧率(支持批处理/Bash/PowerShell)

嘿,我懂你想要的效果——批量处理散在各个子目录里的GIF,转成MP4的同时还得保留每个文件自己的原帧率,而不是统一压成10fps对吧?你原来的命令里正是因为加了fps=10这个滤镜才强制统一了帧率,把这个参数去掉就能实现保留原帧率的需求了。下面给你适配不同环境的解决方案:

1. Windows 批处理(CMD)

直接修改你原来的命令,删掉vf滤镜里的fps=10部分就行,ffmpeg默认会继承输入文件的帧率:

FOR /R %f IN (*.gif) DO ffmpeg -y -stream_loop 0 -i "%~f" -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" "%~pf/%~nf.mp4"

如果是写在.bat脚本里,记得把%f改成%%f:

FOR /R %%f IN (*.gif) DO ffmpeg -y -stream_loop 0 -i "%%~f" -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" "%%~pf/%%~nf.mp4"

简单解释下关键参数:

  • -y:自动覆盖已存在的输出文件,不用手动确认
  • -movflags faststart:把MP4的元数据移到文件开头,更适合在线播放或快速加载
  • -pix_fmt yuv420p:保证转出来的MP4能在大部分播放器/设备上正常播放
  • scale=...:把分辨率调整为偶数,避免编码时出现兼容性问题

2. Bash(Linux/macOS/WSL)

用find命令递归遍历所有子目录里的GIF,再调用ffmpeg处理:

find . -type f -name "*.gif" | while read -r f; do
  ffmpeg -y -stream_loop 0 -i "$f" -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" "${f%.gif}.mp4"
done

3. PowerShell

用Get-ChildItem递归查找GIF文件,循环处理每个文件:

Get-ChildItem -Path . -Filter *.gif -Recurse | ForEach-Object {
  $outputPath = [System.IO.Path]::ChangeExtension($_.FullName, ".mp4")
  ffmpeg -y -stream_loop 0 -i $_.FullName -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" $outputPath
}

另外你提到之前测试转GIF时帧率好像没变化,可能是因为部分GIF的实际帧率和你尝试设置的一致,不过调整后的命令会严格保留每个输入GIF的原始帧率,不用担心统一修改的问题啦。

备注:内容来源于stack exchange,提问作者cudnn_account

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:12:57