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 不能就地编辑文件(输入和输出不能是同一个文件)。
  • 不需要 echocut 当你可以使用 parameter expansion.
  • 是否也可以对子目录中的文件进行此循环?使用find,但这值得作为一个新问题提出,因为它是与主要问题分开。