コマンドラインでオーディオファイルの継続時間を確認する
オーディオファイルのグループの継続時間を確認する必要があります。 UNIXコマンドラインでこれを行う簡単な方法はありますか?
> duration *
私は、継続時間を含む一連のオーディオ情報を生成する統計と呼ばれるオプションがある素晴らしいSoXアプリを持っています。期間のみを取得する方法を探しています。私は出力形式に柔軟性があり、サンプルの長さ、hh:mm:ss、または秒のいずれでもかまいません。後者が私の好みです。
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 }'
soxi -D filename
soxi -D *
Soxiはオーディオファイルのメタデータをクエリします。 Dは期間オプションです。グロビングをサポートしています。 Soxiの兄貴 sox はコマンドラインオーディオ処理を行います。
ffmpeg -i <audiofile> 2>&1 | grep Duration
mediainfo
は、オーディオファイルのミリ秒を返します。現在のディレクトリにオーディオファイルのみがあるとすると、次のようになります。
mediainfo --Inform="Audio;%Duration%" "Miley Cyrus - Wrecking Ball.mp3"
ローカルディレクトリ内のすべてのオーディオの継続時間を計算するには、 this Gist が役立ちます。
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 }'
sox --info -D file --> duration in seconds
sox --info -d file --> duration in HH:mm:ss.ss
sox --info file --> metadata
Cdosbornの answer に加えて、現在のディレクトリのサブフォルダーにあるすべての.mp3
ファイルの長さを再帰的に計算し、合計結果をdays:hours:minutes:seconds
形式で表示します。
Zshの場合:
afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'
Bashまたはshの場合:
find . -name "*.mp3" -exec afinfo {} \; | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'
結果は次のようになります(7日、5時間、6分、58秒):
$ afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'
7:05:06:58
$
Mplayerに基づくソリューション commandlinefsyssyphus によるもので、オーディオファイルとビデオファイルの両方で機能します。
Sudo apt-get install mplayer
find -type f -name "*.mp3" -print0 | xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | Perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1
現在のディレクトリ(およびその下)のすべてのビデオ/オーディオの全長をH:m:sで取得します
変更
*.mp3
一致させたいものに(例:*.avi
、*.wav
)、すべてのファイルを確認する場合は、完全に削除できます。
出力例:00:00:37
別の soxi ベースの回答。ファイル名と期間(時間、分、秒形式)が含まれます。
$for f in *amr; do printf "$f "; soxi -d $f; done
DGT20161216.amr 00:22:04.62
DGT20170108.amr 00:28:22.80
DGT20170117.amr 00:20:05.18
次のように、ffmpegのffprobe
を使用すると、秒単位の生の期間を高い精度で取得できます。
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
ffprobe
ffprobe your_file.mp3 2>&1 | grep "Duration"
出力は次のようになります。
時間:00:44:33.50、開始:0.011995、ビットレート:128 kb /
soxi を使用して、ディレクトリ内の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
に変更してください。
mediainfoはこれを行うことができますが、mediainfoはあまりにも文書化されており、その使用方法を学ぶためにその使用方法を知る必要があるほど有用なツールの1つです(Linuxの世界では多くのことが起こります)。
何時間もの試行錯誤の末、最終的には、ファイル名とその継続時間(ミリ秒単位)の再帰的なコンマ区切りリストを生成することができました。
開始ディレクトリに移動し、次のコマンドを発行します。
find "$(pwd)" -type f -print0 | xargs -0 -I {} mediainfo --Inform="General;%CompleteName%,%Duration%" {} > list.txt
結果はlist.txtに出力されます。
(あなたが自由に使えるafinfo
がない場合)私はすべてのファイルに対して再帰的にそれを得ました
# install mp3info if not yet installed with
Sudo apt-get install mp3info
findコマンドを使用して、合計秒数をcsvファイルに入れます(最初にmp3ファイルなどのディレクトリに移動します)
find . -name "*.mp3" -exec mp3info {} -p "%S\r\n" >> totalSeconds.csv \;
次に、それを開いてください。 LibreOfficeでそれを(時間を取得するために)下部に合計します
=SUM(A{start}:A{end})/60/60