9

我想批量转换包含数百个 FLV 文件的目录,以便每个文件都有一个 MP4 等效文件。我试图通过编写一个 shell 脚本并从终端运行它来自动化这个过程。我该怎么做呢?大多数可用的指令都适用于使用 ffmpeg 的 Linux,但我认为 OS X 没有。谢谢。

4

6 回答 6

16

您可以通过HomebrewMacPorts安装 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

于 2010-08-20T05:13:25.923 回答
10

使用 ffmpeg 从 FLV 转换为 MP4

目标:使用 Bash 脚本将多个 Adob​​e 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 -每个视频文件的元数据

讨论:
在我的第一次尝试中,我无法使用-copyffmpeg 选项将视频转换为 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 文件名

示例日志文件:

示例日志文件


元数据日志文件:
使用ffmpeg从视频中提取元数据

结论:
在从 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,请添加带有指向您的视频文件链接的评论,我将更新我的代码来处理它。

于 2012-11-12T13:58:04.880 回答
2
#!/bin/bash

shopt -s nullglob
shopt -s nocaseglob
for file in *.flv
do
  ffmpeg -i "$file" "${file%flv}mp4"
done
于 2010-08-20T05:23:23.053 回答
1

你可以用 VLC 做到这一点

http://wiki.videolan.org/Transcode#Transcoding_with_the_Command_Prompt

于 2010-08-20T05:58:08.890 回答
0

另一种选择是MPEG Streamclip,它具有非常好的批处理功能。

于 2012-02-20T12:24:40.157 回答
0
find . -iname "*.flv" -exec ffmpeg -nostdin -fflags discardcorrupt -i "{}" -strict experimental -c:v mpeg4 -b:a 192k "{}.mp4"  \;
于 2021-07-16T20:09:40.570 回答