web-dev-qa-db-ja.com

コマンドラインでオーディオファイルの継続時間を確認する

オーディオファイルのグループの継続時間を確認する必要があります。 UNIXコマンドラインでこれを行う簡単な方法はありますか?

> duration *

私は、継続時間を含む一連のオーディオ情報を生成する統計と呼ばれるオプションがある素晴らしいSoXアプリを持っています。期間のみを取得する方法を探しています。私は出力形式に柔軟性があり、サンプルの長さ、hh:mm:ss、または秒のいずれでもかまいません。後者が私の好みです。

39
ted.strauss
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 }'
30
0xbadc0de
soxi -D filename
soxi -D *

Soxiはオーディオファイルのメタデータをクエリします。 Dは期間オプションです。グロビングをサポートしています。 Soxiの兄貴 sox はコマンドラインオーディオ処理を行います。

37
ted.strauss
ffmpeg -i <audiofile> 2>&1 | grep Duration
14
JellicleCat

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
13
DoggoDougal

OSX上

現在のディレクトリの各オーディオファイルの長さを出力します。

afinfo * | awk '/estimated duration/ { print $3 }'

ファイルパスを含めます。

afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }'
9
cdosborn
sox --info -D file             --> duration in seconds
sox --info -d file             --> duration in HH:mm:ss.ss
sox --info file                --> metadata 
5
JJoao

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
$
5
Hamid Rohani

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

3

別の 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
2
alemol

次のように、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 /

1
Matthias Braun

soxi を使用して、ディレクトリ内のwavファイルの合計期間を検索する場合は、次のように使用できます。

soxi -D input_dir/*.wav | python -c "import sys;print(sum(float(l) for l in sys.stdin))

変化する input_dir入力ディレクトリに従って。すべてのwavファイル間の最大/最小期間を検索する場合は、summaxまたはminに変更してください。

1
Navid Naderi

mediainfoはこれを行うことができますが、mediainfoはあまりにも文書化されており、その使用方法を学ぶためにその使用方法を知る必要があるほど有用なツールの1つです(Linuxの世界では多くのことが起こります)。

何時間もの試行錯誤の末、最終的には、ファイル名とその継続時間(ミリ秒単位)の再帰的なコンマ区切りリストを生成することができました。

開始ディレクトリに移動し、次のコマンドを発行します。

find "$(pwd)" -type f -print0 | xargs -0 -I {} mediainfo --Inform="General;%CompleteName%,%Duration%" {} > list.txt

結果はlist.txtに出力されます。

1
alex_223

(あなたが自由に使える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
0
Sempfer