如何使用OS X中的shell脚本以编程方式将FLV视频文件转换为MP4?

Gen*_*neQ 9 unix macos shell video-processing transcoding

我想批量转换包含数百个FLV文件的目录,以便每个文件都具有MP4等效项.我正在尝试通过编写shell脚本并从终端运行它来自动执行此过程.我该怎么做呢?大多数可用的指令都是针对使用ffmpeg的Linux,但我认为OS X没有它.谢谢.

Mic*_*yan 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
Run Code Online (Sandbox Code Playgroud)

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


rwa*_*rvi 10

使用ffmpeg从FLV转换为MP4

目标:使用Bash脚本将多个Adobe Flash Video(FLV)文件转换为MP4.

环境: MAC OS X 10.5.8,终端v.240.2,Bash v.3.2.17

语言: bash

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

先决条件:
下载ffmpeg二进制文件并放在/usr/local/bin目录中.
我的代码基于Jan的blog77.com上的博客.有关详细信息,请参见"参考".
从"Bash脚本"部分下载我的bash脚本.

我的代码说明

  • 复制存在的任何MP4文件
  • 使用检测视频编解码器类型ffmpeg -i [file].
  • 循环浏览每个视频并根据所使用的视频编解码器的类型进行转换.
  • 连接所有ffmpeg日志文件
限制:
仅处理具有FLV1和H264编解码器的视频.


用法:

convert-flv-to-mp4.sh [folder path]
Run Code Online (Sandbox Code Playgroud)

例:

./convert-flv-to-mp4.sh /Users/Shared/Music
Run Code Online (Sandbox Code Playgroud)

输出: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
Run Code Online (Sandbox Code Playgroud)

哪里:

inputlist - 包含所有FLV文件的文件
vtype - 输入文件的视频编解码器类型
i - 输入FLV文件名

示例日志文件:

示例日志文件


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

结论:
在从youtube下载的73个FLV文件上成功测试了一个完整的解决方案.转换34个文件和重新编写39个文件花了8分钟,平均大小为11MB.

Bash脚本:
convert-flv-to-mp4.sh

参考文献:
FFmpeg二进制
文件下载FFmpeg官方文档
如何在Mac上将.flv Flash视频转换为.mp4

可扩展性:
如果您有任何FLV文件的视频流不是FLV1或H264,例如VP6,FLV4,请添加带有视频文件链接的注释我将更新我的代码来处理它.