【问题标题】:How do I programmatically convert FLV video files to MP4 using a shell script in OS X?如何在 OS X 中使用 shell 脚本以编程方式将 FLV 视频文件转换为 MP4?
【发布时间】:2011-04-01 11:54:51
【问题描述】:

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

【问题讨论】:

    标签: macos unix shell video-processing transcoding


    【解决方案1】:

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

    只需将您将上面的脚本放入可执行文件中的任何文件(例如,chmod a+x <i>path/to/convert_all_to_mp4.sh</i>)并通过其完全限定的路径调用它,或将包含它的目录添加到 PATH 环境变量中并通过您提供的名称调用脚本它。

    【讨论】:

    • 这段代码很有潜力。会试一试。除了这个任务,我可以想象它还有很多用途。谢谢。 ;-)
    • 你好,我是这个领域的新手,请帮助我,需要在哪里添加这个脚本以及如何在按钮点击事件中调用这个脚本
    • @avi,我已经更新了答案以包含有关如何调用脚本的更多详细信息。但是,BASH 的基础知识有点超出了问题的范围。您可以在 StackOverflow 上找到有关如何调用 BASH 脚本和操作 PATH 环境变量的其他信息。
    【解决方案2】:

    使用 ffmpeg 从 FLV 转换为 MP4

    目标:使用 Bash 脚本将多个 Adob​​e Flash Video (FLV) 文件转换为 MP4。

    我的环境: MAC OS X 10.5.8、Terminal v.240.2、Bash v.3.2.17(此解决方案应该适用于大多数 Apple Mac 系统)。

    语言: 重击

    说明: 此脚本将搜索指定位置的所有 FLV 文件,遍历每个文件,将它们转换为等效的 MP4 视频并将它们放在子目录 MP4-yymmdd-HHMMSS 中。过程中产生的日志文件放在这个子目录的log目录中。

    先决条件:
    下载 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 将对文件进行转码,这需要相当长的时间。该脚本将决定使用哪个选项。

    代码的关键sn-p:

    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 Download
    FFmpeg Official Documentation
    How to convert .flv Flash video to .mp4 on the Mac

    可扩展性:
    如果您有任何 FLV 文件的视频流不是 FLV1 或 H264,例如VP6,FLV4,添加一个带有视频文件链接的评论,我会更新我的代码来处理它。

    【讨论】:

      【解决方案3】:
      #!/bin/bash
      
      shopt -s nullglob
      shopt -s nocaseglob
      for file in *.flv
      do
        ffmpeg -i "$file" "${file%flv}mp4"
      done
      

      【讨论】:

        【解决方案4】:

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:
            find . -iname "*.flv" -exec ffmpeg -nostdin -fflags discardcorrupt -i "{}" -strict experimental -c:v mpeg4 -b:a 192k "{}.mp4"  \;
            

            【讨论】:

            • 您好,以下是您回答的一些准则:不建议发布纯代码的答案,请考虑同时解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
            猜你喜欢
            • 2013-03-18
            • 2012-01-20
            • 2010-10-04
            • 1970-01-01
            • 2012-01-18
            • 2017-09-26
            • 2012-01-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多