Bash/ffmpeg: 如何遍历所有非16位和44.1khz的wav文件?
Bash/ffmpeg: How to loop over all wave files that do not have 16bit and 44.1 khz?
我有这个脚本,我用它来将目录中的所有 wav 文件转换为 44100 赫兹的 16 位。但是,它还会转换已经具有这些属性的文件。如何过滤文件以便只转换需要转换的文件?
我正在使用 ubuntu 开发 Win 10。
#!/bin/sh
for i in *.WAV;
do
name=`echo "$i" | cut -d'.' -f1`
echo "$name"
ffmpeg -i -f "$i" -acodec pcm_s16le -ar 44100 "${name}.wav";
done
编辑:是否也可以对子目录中的文件进行循环?
使用 if 语句:
#!/bin/bash
mkdir output
shopt -s nocaseglob
for i in *.wav;
do
if [ "$(ffprobe -v error -show_entries stream=sample_fmt -of csv=p=0 "$i")" != "s16" ] || [ "$(ffprobe -v error -show_entries stream=sample_rate -of csv=p=0 "$i")" != "44100" ]
then
echo "$i"
ffmpeg -y -i "$i" -c:a pcm_s16le -ar 44100 "output/${i%.*}.wav";
fi
done
ffprobe
用于获取采样格式和采样率。如果它不等于 s16,44100
那么它将重新编码。
- 输出放在名为
output
的目录中,因为 ffmpeg
不能就地编辑文件(输入和输出不能是同一个文件)。
- 不需要
echo
和 cut
当你可以使用 parameter expansion.
- 是否也可以对子目录中的文件进行此循环?使用
find
,但这值得作为一个新问题提出,因为它是与主要问题分开。
我有这个脚本,我用它来将目录中的所有 wav 文件转换为 44100 赫兹的 16 位。但是,它还会转换已经具有这些属性的文件。如何过滤文件以便只转换需要转换的文件?
我正在使用 ubuntu 开发 Win 10。
#!/bin/sh
for i in *.WAV;
do
name=`echo "$i" | cut -d'.' -f1`
echo "$name"
ffmpeg -i -f "$i" -acodec pcm_s16le -ar 44100 "${name}.wav";
done
编辑:是否也可以对子目录中的文件进行循环?
使用 if 语句:
#!/bin/bash
mkdir output
shopt -s nocaseglob
for i in *.wav;
do
if [ "$(ffprobe -v error -show_entries stream=sample_fmt -of csv=p=0 "$i")" != "s16" ] || [ "$(ffprobe -v error -show_entries stream=sample_rate -of csv=p=0 "$i")" != "44100" ]
then
echo "$i"
ffmpeg -y -i "$i" -c:a pcm_s16le -ar 44100 "output/${i%.*}.wav";
fi
done
ffprobe
用于获取采样格式和采样率。如果它不等于s16,44100
那么它将重新编码。- 输出放在名为
output
的目录中,因为ffmpeg
不能就地编辑文件(输入和输出不能是同一个文件)。 - 不需要
echo
和cut
当你可以使用 parameter expansion. - 是否也可以对子目录中的文件进行此循环?使用
find
,但这值得作为一个新问题提出,因为它是与主要问题分开。