ffmpeg批量重新编码子文件夹

时间:2016-10-04 21:15:57

标签: bash batch-file ffmpeg re-encoding

我正在尝试将几百个视频重新编码为X265,但文件名中有许多目录和一些文件一样。我查看了一堆脚本,并且正在努力找到一个适用于空间和不同目录级别的脚本。

只要没有子目录,这个就可以了:

#!/bin/bash
for i in *.avi;
do 
    ffmpeg -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

我一直在尝试使用这个bash脚本,但它失败了我猜的空白。

#!/bin/bash
inputdir=$PWD
outputdir=$PWD
while IFS= read -r file ; do
  video=`basename "$file"`
  dir=`dirname "$file"`
 ffmpeg -fflags +genpts -i "$file" -c:v libx265 -c:a copy "$dir"/X265_"$video"
done < <(find "$inputdir" -name "*.avi" | head -100)

在这个线程上,对于Windows用户来说它看起来是一个很好的解决方案,但不是linux。 FFMPEG - Batch convert subfolders

FOR /r %%i in (*.mp4) DO ffmpeg32 -i "%%~fi" -map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 aac -b:a 128k -ac 2 -strict -2 -cutoff 15000 -c:a:1 copy "%%~dpni(2)%%~xi"

如果您能指出适合bash的正确解决方案,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

这是findxargs

的典型情况
find /path/to/basedir -name '*.avi' -print0 | xargs -0 convert.sh

其中-print0-0确保使用空格正确处理名称。

在convert.sh中,你有for循环,几乎和你的第一个脚本一样

#!/bin/bash

for i; do
    d=$(dirname "$i")
    b=$(basename "$i")
    ffmpeg -i "$i" -c:v libx265 -c:a copy "$d/X265_$b"
done

for i没有任何意思与&#34;相同,对于所有给出的参数&#34;,这是xargs传递的文件。

要在文件名前添加字符串,必须将名称拆分为目录和基本部分,然后再将它们放在一起。

答案 1 :(得分:0)

使用xargs + sh -c,还可以通过将-I变量传递给{{1 }}作为要用作FILE扩展的位置参数:

sh -c

在这里,我只是用$1切掉.flac扩展名并添加m4a。