在macOS 13.2中使用FFmpeg批量转换.mkv到.mp4的方法求助
在macOS 13.2中使用FFmpeg批量转换.mkv到.mp4的方法求助
我尝试在macOS 13.2上用FFmpeg批量把input文件夹里的.mkv文件转成.mp4到mp4文件夹,试了两个命令都出问题了:
第一个命令:
ffmpeg -i input/*.mkv -codec copy mp4/%~n.mp4
得到错误:
zsh: no matches found: input/*.mkv
第二个加了引号的命令:
ffmpeg -i "input/*.mkv" -codec copy mp4/%~n.mp4
FFmpeg输出版本信息后报错:
input/*.mkv: No such file or directory
想问下有没有办法在macOS 13.2上实现批量转换?
解决方法
你遇到的问题主要有两个核心原因:
- zsh的通配符逻辑:当
input/*.mkv没匹配到任何文件时,zsh会直接报错,不会把它当作字符串传给FFmpeg;就算有匹配,FFmpeg也无法直接处理这种多输入的写法。 %~n是Windows CMD的变量语法,在zsh里完全不生效,得用shell自带的文件名处理工具。
下面是两种可行的批量转换方案:
方法一:用zsh循环逐个处理文件
首先确保目标文件夹mp4存在,先运行:
mkdir -p mp4
然后执行循环命令:
for mkv_file in input/*.mkv; do # 获取去掉扩展名的原文件名 base_name=$(basename "$mkv_file" .mkv) # 执行格式转换 ffmpeg -i "$mkv_file" -codec copy "mp4/${base_name}.mp4" done
这个循环会遍历input文件夹下所有.mkv文件,逐个调用FFmpeg转换,同时保留原文件名(仅替换扩展名)。
方法二:用find命令递归处理(含子目录场景)
如果你的input文件夹还有子目录里的mkv文件需要转换,可以用find实现递归批量处理:
mkdir -p mp4 find input -name "*.mkv" -type f -exec sh -c ' for mkv_file do base_name=$(basename "$mkv_file" .mkv) ffmpeg -i "$mkv_file" -codec copy "mp4/${base_name}.mp4" done ' sh {} +
额外注意事项
-codec copy是直接复制音视频编码,速度极快,但如果原文件的编码在MP4容器中不兼容,转换会失败。这时可以去掉-codec copy,让FFmpeg自动重新编码(速度会慢一些,但兼容性更好)。- 从你的输出信息来看,FFmpeg已经通过Homebrew正确安装,这部分无需额外操作。
备注:内容来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

