【问题标题】:Run FFmpeg from Shell Script从 Shell 脚本运行 FFmpeg
【发布时间】:2010-06-03 05:46:42
【问题描述】:

我找到了一个有用的 shell 脚本,它递归地显示目录中的所有文件。

在哪里打印文件名echo "$i"; #Display File name

我想对非 MP3 文件运行 ffmpeg 命令,我该怎么做?我对 shell 脚本的了解非常有限,所以如果我被勺子喂食,我会很感激! :)

//if file is NOT MP3

ffmpeg -i [the_file] -sameq [same_file_name_with_mp3_extension]

//delete old file

这里是shell脚本供参考。

DIR="."

function list_files()
{
    if !(test -d "$1")  
    then echo $1; return;
    fi

    cd "$1"
    echo; echo `pwd`:; #Display Directory name

    for i in *
    do
               if test -d "$i"  #if dictionary
                then  
                          list_files "$i" #recursively list files
                  cd ..
                else
            echo "$i"; #Display File name
                fi

    done
}

if [ $# -eq 0 ]
then list_files .
exit 0
fi

for i in $*
do
    DIR="$1"
    list_files "$DIR"
    shift 1 #To read next directory/file name
done

【问题讨论】:

    标签: linux shell ffmpeg


    【解决方案1】:

    您可以使用查找单行符来执行相同的操作。假设你要处理的文件都是wav:

    find /path/ -type f -name "*wav" -exec ffmpeg -i {} -sameq {}.mp3 \;
    

    如果要查找“rm”文件,转换后删除:

    find /path/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {} \;
    

    也就是说,如果您想使用显示的 shell 脚本来执行此操作,请使用显示

    的行
    echo "$i";
    

    用这个替换它:

    ffmpeg -i "$i" -sameq "$i".mp3
    

    $i 是一个变量。几行,你有:

    for i in *
    

    这基本上意味着“对于*中的每个元素(它又代表当前目录中的所有文件,这就是所谓的“shell扩展”),将元素/文件的名称放入变量i ,然后执行“do”和“done”之间的所有代码。因此,对于每次迭代,i 将包含此目录中一个文件的名称。

    还有一个部分测试i是否是一个目录,如果是,它递归地列出它的内容。

    最后一点:\;在 find 命令的末尾很重要,它需要在反斜杠之前有一个空格,否则它将不起作用。

    【讨论】:

    • 其实都是rm文件。那一行是否找到文件,转换它并删除旧的?!!
    • 我已经更新了答案来做你在这里问的事情。在您的生产目录上运行批处理之前,请使用一些一次性文件对其进行测试 - 我对删除的文件不承担任何责任:)
    • rm 命令删除旧文件(.rm 文件)吗?顺便说一句,我真的很感谢你的解释,它让事情变得非常清楚。
    • 是的,如果我没记错的话,“&&”的意思是“如果ffmpeg返回任何类型的错误代码,请不要删除它”。
    • 太棒了!感谢 Roadmaster,我会先在几个文件上尝试一下,然后在实际文件上使用之前进行测试!
    【解决方案2】:

    您的 shell 脚本似乎本质上是 ls -1R,因此使用它可能更容易。至于在非 MP3 文件上运行 ffmpeg,使用 find 可能更容易,而不是编写整个 shell 脚本来完成它。假设您通过扩展名识别 MP3 文件:

    find your-path -not -name "*.mp3" -exec ffmpeg -i '{}' -sameq '{}.mp3' \;
    

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2013-07-29
      相关资源
      最近更新 更多