如何批量转换嵌套子目录中的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
相关产品推荐
相关产品推荐

