【问题标题】:Shell script - loop through directories?Shell脚本 - 遍历目录?
【发布时间】:2013-12-07 13:28:36
【问题描述】:

如果我想遍历嵌套目录列表并运行一组命令,我该怎么做?

我的目录结构是这样的:

  • 视频
    • 文件夹 1 -> VTS_01_1.mp4
    • 文件夹2 -> VTS_01_1.mp4
    • 文件夹 3 -> VTS_01_1.mp4 ....等等

我需要遍历每个文件夹并运行下面的脚本。所有 .mp4 文件都命名为 VTS_01_1.mp4,但我想用 *.mp4 通配符条件来做,以防万一它们不是.每个目录中的输出文件应该是“VTS_01_h264.mp4”。想法?我使用的是 CentOS 6.4。

ffmpeg -y -i "VTS_01_1.mp4" -an -pass 1 -threads 2 -vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \
       -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \
       -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \
       -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \
           -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\
       -qmax 51 -qdiff 4 "video_tmp.mp4"



ffmpeg -y -i "VTS_01_1.mp4" -acodec libfaac -ar 44100 -ab 96k -pass 2 -threads 2 -vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \
       -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \
       -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \
       -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \
           -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\
       -qmax 51 -qdiff 4 "video_tmp.mp4"



qt-faststart "video_tmp.mp4" "VTS_01_h264.mp4"

【问题讨论】:

  • 你没有理由声明这么多选项。这就是 x264 预设的用途。您可以将命令简化为:ffmpeg -y -i input -an -pass 1 -vcodec libx264 -preset slow -b:v 512k -f mp4 /dev/null && ffmpeg -i input -pass 2 -vcodec libx264 -preset slow -b:v 512k -acodec libfaac -ar 44100 -b:a 96k -movflags faststart output.mp4 第一次输出可以发送到/dev/null-b 不明确所以您应该指定流,您可以将qt-faststart 替换为第二个中的-movflags faststart 选项通过。

标签: shell ffmpeg centos mp4 h.264


【解决方案1】:
#!/usr/bin/env bash

set -x

#----------+code----------
find *.mp4 -maxdepth 3 -type f | while read files
do
./ffmpeg.sh "${files}"

qt-faststart "${files}_tmp.mp4" "VTS_01_h264.mp4"
done
#----------.code----------

在 ffmpeg.sh 中:-

#!/usr/bin/env bash

set -x

#----------+code----------
ffmpeg -y -i "${1}" -an -pass 1 -threads 2 -vcodec \
    libx264 -b 512k -flags +loop+mv4 -cmp 256 \
   -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \
   -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \
   -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \
   -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\
   -qmax 51 -qdiff 4 "${1}_tmp.mp4"
#----------.code----------

【讨论】:

    【解决方案2】:

    find 命令在这类事情上非常强大,试试吧:

    find videos/ -name "*.mp4" -exec ffmpegScript {} \;
    

    这会查找以.mp4 为结尾的所有文件(也在子目录中)并执行ffmpegScript nameOfMp4File,其中nameOfMp4File 是找到的文件的名称,一次一个。 find 负责循环本身。

    现在我们需要定义ffmpegScript

    #!/usr/bin/env bash
    
    inputFile="$1"
    outputFile="$(dirname $1)"/VTS_01_h265.mp4
    
    ffmpeg -y -i "$inputFile" -acodec libfaac -ar 44100 -ab 96k -pass 2 -threads 2 -vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \
       -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \
       -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \
       -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \
           -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\
       -qmax 51 -qdiff 4 "video_tmp.mp4"
    
    qt-faststart "video_tmp.mp4" "$outputFile"
    

    inputFile 变量设置为传递给ffmpegscript 的第一个位置参数,outputFile 变量设置为相同的路径,但不同的basename

    注意:如果目录中有多个*.mp4 文件,此脚本将覆盖您的输出文件。另外,我没有尝试整个脚本,因为这里没有任何可用的 *.mp4 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 2011-03-21
      相关资源
      最近更新 更多