【问题标题】:Bash/ffmpeg: How to loop over all wave files that do not have 16bit and 44.1 khz?Bash/ffmpeg:如何遍历所有没有 16 位和 44.1 khz 的 wav 文件?
【发布时间】:2021-02-01 20:02:59
【问题描述】:

我有这个脚本,用于将目录中的所有 wav 文件转换为 44100 hz 的 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

编辑:是否也可以对子目录中的文件进行此循环?

【问题讨论】:

  • 使用bashsh 通常不是bash):shopt -s globstar; for i in **/*.wav; do echo "$i"; done
  • 我是编写 shell 脚本的新手。我正在使用 sh myscript.sh 运行我的脚本。所以也许我使用的是 sh 而不是 bash?那里也行吗?
  • 您的代码也适用于bash

标签: bash shell ffmpeg windows-subsystem-for-linux


【解决方案1】:

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

【讨论】:

  • 这似乎正确过滤了一些不是 16 位的文件。但是,我收到错误“文件或目录不存在”并且输出文件夹为空。
  • @MaxJ。我复制了你原来的命令,它有一个我没有注意到的错字。固定的。查看更新的答案。
  • 感谢您的帮助。当有多个文件需要转换时,输出文件夹现在只包含一个文件。另外,您确定我不能覆盖现有文件吗?我上面的代码似乎就是这样做的。
  • @MaxJ。是的,我绝对确定您不应该在 ffmpeg 的输入和输出中使用相同的名称。它对您“有效”,因为您的输入是 file.WAV,而您的输出是 file.wav,但是将新文件输出到新目录更安全、更干净。然后,您可以根据自己的喜好处理原件。我的回答对我有用。显示 ffprobe -v error -show_entries stream=sample_fmt,sample_rate -of csv=p=0 input.WAV 的输出,用于处理无法使用的文件。
  • @MaxJ。 Many waysdeal,但我只是添加了 shopt -s nocaseglob 以忽略大小写。
猜你喜欢
  • 2021-11-26
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多