オーディオ ファイルのグループの長さを確認する必要があります。UNIXコマンドラインでこれを行う簡単な方法はありますか?
> duration *
私は、期間を含む一連のオーディオ情報を生成する stats というオプションを備えた素晴らしい SoX アプリを持っています。期間のみを取得する方法を探しています。私は出力形式に柔軟に対応しており、サンプルの長さ、hh:mm:ss、または秒のいずれかになります。後者が私の好みです。
soxi -D filename
soxi -D *
Soxiはオーディオファイルのメタデータを照会します。Dは期間オプションです。グロブをサポートします。Soxiの兄貴のsoxは、コマンドラインオーディオ処理を行います。
mp3info -p "%m:%02s\n" filename
指定したファイルの長さをmm:ss
形式で示します (mm は 59 より大きい場合があります)。ファイル内の合計秒数だけを取得するには、次を使用します。
mp3info -p "%S\n" filename
すべての mp3 ファイルの合計の長さを秒単位で取得するには、AWK が役立ちます。
mp3info -p "%S\n" *.mp3 | awk 'BEGIN { s = 0 }; { s = s + $1 }; END { print s }'
mediainfo
は、オーディオ ファイルのミリ秒を返します。現在のディレクトリに音声ファイルのみがあると仮定すると、次のようになります。
mediainfo --Inform="Audio;%Duration%" "Miley Cyrus - Wrecking Ball.mp3"
ローカル ディレクトリ内のすべてのオーディオの長さを計算するには、次の要点が役立ちます。
shopt -s nullglob
let playlist_duration_ms=0
for song_file in *.{mp3,ogg,m4a,flac,wav}; do
playlist_duration_ms=$(expr $playlist_duration_ms + $(mediainfo --Inform="Audio;%Duration%" "$song_file"))
done
shopt -u nullglob
let playlist_duration_secs=$(expr $playlist_duration_ms / 1000)
let playlist_duration_mins=$(expr $playlist_duration_ms / 60000)
let playlist_duration_remaining_secs=$(expr $playlist_duration_secs - $(expr $playlist_duration_mins \* 60))
echo $playlist_duration_mins minutes, $playlist_duration_remaining_secs seconds
OSX 上
現在のディレクトリにある各オーディオ ファイルの長さを出力します。
afinfo * | awk '/estimated duration/ { print $3 }'
ファイルパスを含めます:
afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }'
ffprobe
次のように、ffmpeg を使用すると、秒単位の生の継続時間を高精度で取得できます。
ffprobe -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "filename.mp3" 2>/dev/null
さらなるスクリプトで使いやすい出力は、次のようにフォーマットされます。
193.656236
それを拡張すると、以下は現在のディレクトリ内のすべての .mp3 ファイルの合計時間を秒単位で測定します。
LENGTH=0; for file in *.mp3; do if [ -f "$file" ]; then LENGTH="$LENGTH+$(ffprobe -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file" 2>/dev/null)"; fi; done; echo "$LENGTH" | bc
また、いくつかの拡張子のオーディオ ファイルの合計の長さを測定するために、別のワイルドカードを追加できます。
LENGTH=0; for file in *.mp3 *.ogg; do if [ -f "$file" ]; then LENGTH="$LENGTH+$(ffprobe -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file" 2>/dev/null)"; fi; done; echo "$LENGTH" | bc
soxiと python を使用してディレクトリ内の wav ファイルの合計時間を知りたい場合は、次のように使用できます。
soxi -D input_dir/*.wav | python -c "import sys;print(sum(float(l) for l in sys.stdin))"
input_dir
入力ディレクトリに従って変更します。すべての wav ファイル間の最大/最小デュレーションを見つけたい場合は、または に自由に変更しsum
てください。max
min