【问题标题】:Batch avconv re-encode videos halfway through the list批量 avconv 在列表中途重新编码视频
【发布时间】:2023-03-22 10:50:01
【问题描述】:
由于我有一台运行 Linux 的低端计算机,我经常需要重新编码高清视频,降低质量以便能够在我的计算机上观看它们。一个典型的例子是当我下载了一个系列的几集时,我无法一次将它们全部转换,我需要在系列中途开始重新编码。
我通常使用这条线将单集转换为较低质量:
avconv -i anime_episode_01.mkv -map 0 -c copy -c:v libx264 -crf 31 anime_01.mkv
如果我要一次批量转换它们,我会使用类似的东西:
for i in *.mkv;do avconv -i "$i" -map 0 -c copy -c:v libx264 -crf 31 "encoded/$i";done
encoded 是一个子目录。
但是如果我需要从第 5 集开始重新编码怎么办?
我不知道。
【问题讨论】:
标签:
bash
batch-processing
avconv
【解决方案1】:
可能有很多方法可以做到这一点,这里有几个选项。
选项 1:使用seq
使用seq 生成序列,循环并编码。
从 5 到 15 的序列:
seq 5 15
如果您需要格式化数字,例如要获得一位数字的 0 前缀,您可以
使用 -f 开关,它采用浮点/双精度的 printf 样式格式参数。
seq -f %02.0f 5 15
这可以在循环中使用,例如像这样:
for i in $(seq -f %02.0f 5 15); do
filename="anime_episode${i}.mkv"
echo "Encoding episode $i: $filename"
avconv -i "$filename" -map 0 -c copy -c:v libx264 -crf 31 "encoded/$filename"
done
选项2:检查编码文件是否存在
执行与当前循环中几乎相同的操作,但仅在以下情况下执行编码
编码文件尚不存在。
for i in *.mkv; do
if [ ! -f encoded/$i ]; then
echo "Encoding file: $i"
avconv -i "$i" -map 0 -c copy -c:v libx264 -crf 31 "encoded/$i"
else
echo "Skipped file: $i"
fi
done