我想批量转换包含数百个 FLV 文件的目录,以便每个文件都有一个 MP4 等效文件。我试图通过编写一个 shell 脚本并从终端运行它来自动化这个过程。我该怎么做呢?大多数可用的指令都适用于使用 ffmpeg 的 Linux,但我认为 OS X 没有。谢谢。
6 回答
您可以通过Homebrew或MacPorts安装 ffmpeg 。使用 Homebrew 安装 ffmpeg 的命令是brew install ffmpeg
;同样,使用 MacPorts 安装 ffmpeg 的命令是sudo port install ffmpeg
. 安装 ffmpeg 后,这里有一个用于转换文件的简单(而且有点幼稚)的脚本。您可能需要添加更多标志,具体取决于您所需的选项。
#! /bin/bash
function convert_all_to_mp4() {
for file in *.flv ; do
local bname=$(basename "$file" .flv)
local mp4name="$bname.mp4"
ffmpeg -i "$file" "$mp4name"
done
}
convert_all_to_mp4
只需将您将上述脚本置于可执行文件中的任何文件(例如,)并通过其完全限定路径调用它,或将包含它的目录添加到 PATH 环境变量并按您给它的名称调用脚本。chmod a+x path/to/convert_all_to_mp4.sh
使用 ffmpeg 从 FLV 转换为 MP4
目标:使用 Bash 脚本将多个 Adobe Flash 视频 (FLV) 文件转换为 MP4。
我的环境: MAC OS X 10.5.8、Terminal v.240.2、Bash v.3.2.17(此解决方案应该适用于大多数 Apple Mac 系统)。
语言: bash
说明: 此脚本将搜索指定位置的所有 FLV 文件,遍历每个文件,将它们转换为等效的 MP4 视频并将它们放在子目录MP4-yymmdd-HHMMSS中。过程中产生的日志文件放在该子目录下的日志目录中。
先决条件:
下载 ffmpeg 二进制文件并放在/usr/local/bin
目录中。
我的代码基于Jan 在trick77.com 上的博客。有关详细信息,请参阅“参考资料”。
从“Bash 脚本”部分下载我的 bash 脚本。
我的代码解释
- 复制存在的任何 MP4 文件
- 使用 检测视频编解码器类型
ffmpeg -i [file]
。 - 循环播放每个视频并根据使用的视频编解码器类型进行转换。
- 连接所有 ffmpeg 日志文件
仅使用 FLV1 和 H264 编解码器处理视频。
用法:
convert-flv-to-mp4.sh [folder path]
例子:
./convert-flv-to-mp4.sh /Users/Shared/Music
输出:MP4-yymmdd-HHMMSS子目录
下的 mp4 文件
日志:
convert-flv-to-mp4.log.txt - 程序日志
ffmpeg-yyyymmdd-HHMMSS.log.txt - 转换后的每个文件的 ffmpeg 二进制日志
ffmpeg.log.txt - 上述所有 ffmpeg 日志的编译
metadata.csv -每个视频文件的元数据
讨论:
在我的第一次尝试中,我无法使用-copy
ffmpeg 选项将视频转换为 FLV1 视频流。相反,我需要使用以下 ffmpeg 选项:
-strict experimental -b:a 64k
这意味着转换不会因小错误而停止,并且它使用 64k 音频比特率转换。
使用该-copy
选项只会重新混合输入视频,因此速度很快。否则,ffmpeg 将对文件进行转码,这需要相当长的时间。该脚本将确定使用哪个选项。
关键代码片段:
ls ${inputdir}/*.flv>$inputlist
for i in $(cat $inputlist); do
...
case $vtype in
flv1)
ffmpeg -report -v info -nostdin -fflags discardcorrupt -i $i -strict experimental -c:v mpeg4 -b:a 64k ${outputdir}/${basename}.mp4
h264)
ffmpeg -report -v verbose -nostdin -fflags discardcorrupt -i $i -vcodec copy -acodec copy ${outputdir}/${basename}.mp4
esac
...
done
在哪里:
inputlist - 包含所有 FLV 文件的文件
vtype - 输入文件的视频编解码器类型
i - 输入 FLV 文件名
示例日志文件:
元数据日志文件:
结论:
在从 youtube 下载的 73 个 FLV 文件上成功测试了一个完整的解决方案。转码 34 个文件和重新混合 39 个文件需要 8 分钟,平均大小为 11MB。
Bash 脚本:
convert-flv-to-mp4.sh
参考资料:
FFmpeg Binary 下载
FFmpeg 官方文档
如何在 Mac 上将 .flv Flash 视频转换为 .mp4
可扩展性:
如果您有任何 FLV 文件的视频流不是 FLV1 或 H264,例如 VP6、FLV4,请添加带有指向您的视频文件链接的评论,我将更新我的代码来处理它。
#!/bin/bash
shopt -s nullglob
shopt -s nocaseglob
for file in *.flv
do
ffmpeg -i "$file" "${file%flv}mp4"
done
另一种选择是MPEG Streamclip,它具有非常好的批处理功能。
find . -iname "*.flv" -exec ffmpeg -nostdin -fflags discardcorrupt -i "{}" -strict experimental -c:v mpeg4 -b:a 192k "{}.mp4" \;