如何使用 bash 命令或 Ruby 使用 ffmpeg 将 mp4 文件批量转换为 ogg
Posted
技术标签:
【中文标题】如何使用 bash 命令或 Ruby 使用 ffmpeg 将 mp4 文件批量转换为 ogg【英文标题】:How to batch convert mp4 files to ogg with ffmpeg using a bash command or Ruby 【发布时间】:2012-06-01 19:13:30 【问题描述】:我正在运行 OSX,对视频转换一无所知。但我有 200 个视频都是 mp4 格式,无法在 Firefox 中播放。我需要将它们转换为 ogg 才能使用 html5 视频标签。
这些文件存在于一个文件夹结构中,因此很难一次处理一个文件。我希望 bash 命令或 Ruby 命令遍历所有子文件夹并找到所有 .mp4 并转换它们。
我找到了一份关于如何使用 Google 执行此操作的参考:http://athmasagar.wordpress.com/2011/05/12/a-bash-script-to-convert-mp4-files-to-oggogv/
#!/bin/bash
for f in $(ls *mp4 | sed ‘s/\(.*\)\..*/\1/’)
do
ffmpeg -i $f.mp4 -acodec vorbis -vcodec libtheora $f.ogg
done
但不知道如何将其从 linux 转换为 osx。
【问题讨论】:
选项 '-sameq' 并不意味着'相同质量' https://ffmpeg.org/trac/ffmpeg/wiki/Option%20'-sameq'%20does%20NOT%20mean%20'same%20quality' 此答案与问题无关,因为它没有提及使用该选项。 【参考方案1】:虽然您的问题的直接答案是这样的:
#!/bin/bash
MOVIES=~/Movies/
find "$MOVIES" -name '*.mp4' -exec sh -c 'ffmpeg -i "$0" -sameq "$0%%.mp4.ogg"' \;
exit;
我认为您可能会使用VP8 or webm codec 找到更好的结果,因为它会给您带来更好的结果,实际上在现代版本的Firefox 中是preferred。鉴于此,你应该试试这个:
#!/bin/bash
MOVIES=~/Movies/
find "$MOVIES" -name '*.mp4' -exec sh -c 'ffmpeg -i "$0" -sameq "$0%%.mp4.webm"' \;
exit;
这两种方法都会导致您生成的视频质量下降,因为它们正在重新编码已经编码的材料,而且在我看来,即使是 webm 编解码器也不如使用正确编码的 MP4 h.264 编解码器。
【讨论】:
有什么方法可以在命令中使用ffmpg设置帧率或其他设置来提高质量? 确定 -r 标签将设置帧速率,您可以使用 -b:v 标签设置比特率,这样您就可以使用如下内容:#!/bin/bash MOVIES=~/Movies/ find "$MOVIES" -name '*.mp4' -exec sh -c 'ffmpeg -i "$0" -r 23.976 -b:v 800k -bt 800k -sameq -sameq "$0%%.mp4.webm"' \; exit;
在这种情况下不建议使用-sameq
。此选项并不意味着“相同的质量”,正如文档过去所暗示的那样,并且可能不会像您认为的那样做。它不适合在不共享相同量化器比例的格式之间使用。
请注意,-sameq
可能需要替换为 -qscale 0
或等效项(如最新版本 (git-2012-11-23-e9c3723) 中的 ffmpeg CLI 输出所建议的那样)跨度>
本文中的示例无需任何更改即可工作:thethemefoundry.com/blog/convert-mp4-to-webm【参考方案2】:
这是使用 Ruby,假设您使用的 ffmpeg 是正确的:
Dir.glob("**/*.mp4").each do |filename|
new_filename = File.join(
File.dirname(filename),
"#File.basename(filename, ".mp4").ogg")
`ffmpeg -i "#filename" -acodec vorbis -vcodec libtheora "#new_filename"`
end
"**/*.mp4"
的 Dir.glob 递归地匹配子目录中带有 .mp4 扩展名的所有文件。
【讨论】:
感谢您的回答,但它返回:ruby convert.rb convert.rb:3:inblock in <main>': undefined local variable or method
file' for main:Object (NameError) 任何想法以上是关于如何使用 bash 命令或 Ruby 使用 ffmpeg 将 mp4 文件批量转换为 ogg的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用“sh”或“bash”命令的情况下运行 shell 脚本?
如何将执行命令从 bash 脚本转换为 C?或如何在“W”模式下正确使用 popen()?