如何使用 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:in block in <main>': undefined local variable or method file' for main:Object (NameError) 任何想法

以上是关于如何使用 bash 命令或 Ruby 使用 ffmpeg 将 mp4 文件批量转换为 ogg的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用“sh”或“bash”命令的情况下运行 shell 脚本?

如何使用 Ruby 编写 shell 脚本?

如何将执行命令从 bash 脚本转换为 C?或如何在“W”模式下正确使用 popen()?

如何使用Ruby进行shell脚本编写?

如何使用 mail 或 mailx 命令从 bash 脚本以 HTML 格式发送电子邮件(Centos/Redhat)

如何在 Ruby 脚本中为命令 shell 获取环境变量?