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

Bash 如何使用shell脚本将多个文件从mp4转换为flv,bash,shell,batch-file,ffmpeg,file-conversion,find,Bash,Shell,Batch File,Ffmpeg,File Conversion,Find,假设我有一堆视频放在目录/home/user/videos/waiting_conversion中,我如何使用cron运行类似于此的脚本,将每个视频批量转换为不同的格式 /bin/sh-c$'nice/usr/bin/ffmpeg-i\044'\'$'/home/user/videos/waiting\u conversion/video\u file\u 1.mp4'\'$'-s\044'\''$'480x320'\''$''''''''-vcodec libx264-acodec libmp

假设我有一堆视频放在目录
/home/user/videos/waiting_conversion
中,我如何使用cron运行类似于此的脚本,将每个视频批量转换为不同的格式

/bin/sh-c$'nice/usr/bin/ffmpeg-i\044'\'$'/home/user/videos/waiting\u conversion/video\u file\u 1.mp4'\'$'-s\044'\''$'480x320'\''$''''''''-vcodec libx264-acodec libmp3lame-ab\044'\''''$'64k'''''''$'-vpre fast-crf\044''''$'30'\'''''''$'''''''-ar\044''''''''$'''''''''''''''''''$'''-f\fv-220x50''''''''''''''''''''''''

上述脚本对于单个转换工作正常,但是:

  • 它假定视频的名称是静态/已知的(批转换时不会出现这种情况)
  • 它假设只有一个视频要转换(可能是也可能不是),即没有“循环”
  • 它保留原始文件,而不是删除它(这是我希望发生的事情,以防止重复转换)
  • 最终的问题是如何为
    /home/user/videos/waiting_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
    
    用法
    • 使用glob
      /script.sh/home/user/videos/converted/video\u文件*.mp4
    • 文件名为
      /script.sh/home/user/videos/converted/video\u file\u 01.mp4
    • 通过管道
      find/home/user/videos/converted-type f-name'*video*mp4'|/script.sh
      (脚本检测
      STDIN的使用)
    尝试这样做:

    #!/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
    
    用法
    • 使用glob
      /script.sh/home/user/videos/converted/video\u文件*.mp4
    • 文件名为
      /script.sh/home/user/videos/converted/video\u file\u 01.mp4
    • 通过管道
      find/home/user/videos/converted-type f-name'*video*mp4'|/script.sh
      (脚本检测
      STDIN的使用)

    在这种情况下,
    basename
    命令是您的朋友。你可以使用这个模式

    VIDEOS = /home/user/videos
    for srcfile in ${VIDEOS}/awaiting_conversion/*.mp4 ; do
        dstfile=${VIDEOS}/converted/`basename ${srcfile} .mp4`.flv
        convertcommand ${srcfile} ${dstfile}
    done
    
    basename将目录从src文件中剥离,并将后缀也剥离。然后,您只需在新路径的前面加上新的后缀


    自动删除旧文件时要小心。您可能可以检查一些内容,例如a)ffmpeg返回代码,b)dstfile的文件大小为某个大小或更大,或者c)让它自动为您播放新文件,以便您可以快速查看它,然后在质量不正确的情况下控制-c转换或其他内容。如果您只是想防止重复转换,最好将文件移动到另一个目录,然后在确认其全部工作正常后将其删除。

    在这种情况下,
    basename
    命令是您的朋友。你可以使用这个模式

    VIDEOS = /home/user/videos
    for srcfile in ${VIDEOS}/awaiting_conversion/*.mp4 ; do
        dstfile=${VIDEOS}/converted/`basename ${srcfile} .mp4`.flv
        convertcommand ${srcfile} ${dstfile}
    done
    
    basename将目录从src文件中剥离,并将后缀也剥离。然后,您只需在新路径的前面加上新的后缀

    自动删除旧文件时要小心。您可能可以检查一些内容,例如a)ffmpeg返回代码,b)dstfile的文件大小为某个大小或更大,或者c)让它自动为您播放新文件,以便您可以快速查看它,然后在质量不正确的情况下控制-c转换或其他内容。如果您只是想防止重复转换,最好将文件移动到另一个目录,然后在确认其全部正常工作后将其删除