如何使用bash命令或Ruby使用ffmpeg将mp4文件批量转换为ogg

我正在运行OSX,不知道有关video转换的信息。 但我有200个video都是mp4格式,不能在Firefox中播放。 我需要将它们转换为ogg以使用html5video标记。

这些文件存在于文件夹结构中,这使得一次只能执行一个文件很困难。 我希望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。

虽然你问题的直接答案是这样的:

 #!/bin/bash MOVIES=~/Movies/ find "$MOVIES" -name '*.mp4' -exec sh -c 'ffmpeg -i "$0" -sameq "${0%%.mp4}.ogg"' {} \; exit; 

我认为使用VP8或webm编解码器可能会找到更好的结果,因为它可以提供更好的结果,并且在现代版本的Firefox中实际上是首选 。 鉴于此,你应该试试这个:

 #!/bin/bash MOVIES=~/Movies/ find "$MOVIES" -name '*.mp4' -exec sh -c 'ffmpeg -i "$0" -sameq "${0%%.mp4}.webm"' {} \; exit; 

这两种方法都会导致video质量下降,因为它们会对已经编码的素材进行重新编码,在我看来,即使是webm编解码器也不如使用h.264的正确编码的MP4好。编解码器。

这是使用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的所有文件。