bash - 如何使用 shell 脚本将多个文件从 mp4 转换为 flv

标签 bash shell batch-file ffmpeg file-conversion

假设我在目录 /home/user/videos/awaiting_conversion 中有一堆视频我将如何使用 cron 运行与此类似的脚本以将每个视频批量转换为不同的格式?
/bin/sh -c $'nice /usr/bin/ffmpeg -i \044'\'$'/home/user/videos/awaiting_conversion/video_file_1.mp4'\'$' -s \044'\'$'480x320'\'$' -vcodec libx264 -acodec libmp3lame -ab \044'\'$'64k'\'$' -vpre fast -crf \044'\'$'30'\'$' -ar \044'\'$'22050'\'$' -f flv -y \044'\'$'/home/user/videos/converted/video_file_1.flv'\'$''
上面的脚本适用于单次转换,但是:

  • 它假定视频的名称是静态的/已知的(批量转换时不会出现这种情况)。
  • 它假设只有一个视频要转换(可能是也可能不是),即没有“循环”。
  • 它将原始文件保留在原处而不是删除它(这是我希望发生的事情以防止重复转换)。

  • 最终的问题是如何为 /home/user/videos/awaiting_conversion 中存在的每个视频运行该脚本,将文件名作为变量传递?

    最佳答案

    尝试这样做:

    #!/bin/bash
    
    checkFile(){
        [[ -s $1 && -f $1 ]] && return 0 || return 1
    }
    
    mp42flv(){
        for arg; do
            checkFile "$arg" || continue
            /usr/bin/ffmpeg \
                -i "$arg" \
                -s '480x320' \
                -vcodec libx264 \
                -acodec libmp3lame \
                -ab '64k' \
                -vpre fast \
                -crf '30' \
                -ar '22050' \
                -f flv \
                -y "${arg%.*}.flv" ||
                    echo >&2 "Error treating $arg"
        done
    }
    
    if [[ -t 0 ]]; then
        mp42flv "$@"
    else
        while IFS= read -r a; do
            checkFile "$a" || continue
            mp42flv "$a"
        done
    fi
    

    用法
  • 带着一团 ./script.sh /home/user/videos/converted/video_file*.mp4
  • 带有文件名 ./script.sh /home/user/videos/converted/video_file_01.mp4
  • 通过管道 find /home/user/videos/converted -type f -name '*video*mp4' |./script.sh (脚本检测到 STDIN 的使用)
  • 关于bash - 如何使用 shell 脚本将多个文件从 mp4 转换为 flv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15672101/

    相关文章:

    bash - 为文件和文件夹设置不同的掩码

    bash - 如何使用带参数的字符串来调用脚本,就像 bash 在解释命令行时所做的那样?

    regex - 如何查看字符串是否为四个字母长? – Windows 批处理

    windows - 批处理手动运行良好。但是当从任务调度程序运行时会出错

    batch-file - robocopy 在批处理文件中的标准输出和错误输出

    php - Ziparchive 无法仅在 PHP 中打开 zip 文件

    linux - 在bash中将字符串拆分为数组

    php - 尝试在 PHP/Apache 中执行 exec ("unix2dos xxx"时出现问题

    bash - 复制替换文件名字符串中的内容

    shell - 如何在 docker 容器中修复 ctrl+c